• python之全局变量与局部变量


    全局变量:

      -   在书写中顶格开始;
      -   一旦定义完毕在整个文件生效;
      -   在函数内如果定义了同名全局变量名,会“覆盖”掉全局变量;
      -   在函数中同名的变量,当在函数退出后消失,全局的同名变量恢复;
      -   如果在函数中想修改外部的全局变量加global关键字;

    局部变量   

      -   在函数、过程中定义的变量
      -   只在函数、过程中有效;

    #在函数中修改外部的全局变量

    name="abc"
    
    def test1():
        global name
        print("修改前:",name)
        name="ZZZ"
        print("修改后:",name)
        
    test()

    可变&不可变的全局变量:

      -   函数中直接引用外部不可变的全局变量时,是只读的;
      -   如果引用的外部全局变量是可变类型(列表、字典),则可以对内部元素进行操作;
      -   如果想修改不可变类型的,就要加global关键字;
      -   如果在函数中定义了同名的局部变量同时又global关键字引用了外部的全局变量,则报错
      -    (个人意见)不要同时引用,变量名那么多,为什么硬要把自己搞的那么复杂,代码可读性那么差

    注意,变量名定义规范:
      - 全局变量名一律大写;
      - 局部变量名一律小写;

    #引用外部全局变量

    name="abc"
    
    def test1():
        print("name是:",name)
        
    test1()

    #操作外部可变类型的变量

    name=["abc","ZZZ"]
    def test1():
        name.append("CCC")   #当全局变量是可变类型时,无需加global关键字,要谨慎这种操作
        print(name)
        
    test1()
    返回结果:
    ['abc', 'ZZZ', 'CCC']

    #修改外部可变类型的全局变量

    name=["abc","ZZZ"]
    def test1():
        name.append("CCC")
        name[0]="KKK"
        print(name)
    
    test1()
    返回结果:
    ['KKK', 'ZZZ', 'CCC']

    #内部定义之后同时引用外部全局变量,会报错

    name=["abc","ZZZ"]
    def test1():
        name=[1,2,3]
        global name
        print(name)
    
    test1()
    返回结果:
    SyntaxWarning: name 'name' is assigned to before global declaration
      global name
    [1, 2, 3]

    函数嵌套中引用外部全局变量,同时定义同名内部变量,要注意这期间的变化;
    下面的global引用的是最外层的全局变量,而非上层函数内的变量
    例如:

    name="python"
    
    def test1():
        name="Java"
        def test2():
            global name
            name="C++"
        test2()
        print(name)        #注意这里的name仍旧是test1函数里的name
        
    print(name)
    test1()
    print(name)
    返回结果:
    python
    Java
    C++

    nonlocal关键字:
      -   指定上一级变量;
      -   非引用全局变量;
    例如:

    name="python"
    
    def test1():
        name="Java"
        def test2():
            nonlocal name  #引用上一级函数内的name
            name="C++"     #修改上一级函数中的name
        test2()
        print(name)
        
    print(name)
    test1()
    print(name)
    返回结果:
    python
    C++
    python
  • 相关阅读:
    UVA 11806 组合数学+容斥
    Educational Codeforces Round 37 (Rated for Div. 2) G
    java 5 线程池
    团队-象棋游戏-项目进度
    结对-五子棋-测试过程
    结对-五子棋游戏-开发过程
    课后作业-阅读任务-阅读提问-2
    20171006-构建之法:现代软件工程-阅读笔记
    结队-五子棋游戏-项目进度
    团队-象棋游戏-代码设计规范
  • 原文地址:https://www.cnblogs.com/Kumanon/p/10390671.html
Copyright © 2020-2023  润新知