Python 全局变量和局部变量,global 和 nonlocal关键字

全局变量和局部变量
    全局变量:定义在函数外的变量
    局部变量:定义在函数内部变量
    获取变量值时候先获取当前作用域变量名称和变量值,如果没找到到上一层作用域招变量的值,在没有就报错,先获取局部变量,没有获取全局变量

2,局部变量

    def test01():
        a=10
        print('修改前',a)
        a=20
        print('修改后',a)
    def test02():
        a=40
        print('我是02的a',a)
    test01()
    test02()

   
    局部变量就是函数内部定义的变量
    不同函数,可以定义相同名字局部变量,互相不影响
3.全局变量
    全局变量是声明在函数外部的变量,定义在函数外的拥有全局作用域
    例子1:

        a=100
        print('打印全局变量:',a)

        def test1():
            print('test1中使用全局变量',a)
        def test2():
            print('test2中使用全局变量',a)
        test1()
        test2()

    例子2:
        #全局变量与局部变量同名  

        a = 10      #全局变量  
        print("全局变量a:%d"%a)  
        def test01():  
            a = 20  
            print("test01中的a:%d"%a)  
        def test02():  
            print("test02中的a:%d"%a)  
          
        test01()  
        test02() 

 
    当全局变量与局部变量同名时,优先使用局部变量
    修改全局变量(global关键字)

        a=100
        print('全局变量',a)
        def test1():
            global a
            a=200
            print('test1中修改全局变量a',a)
        def test2()
            print('tes2中使用全局变量',a)
        test1()


global 和 nonlocal关键字
    当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
    以下实例修改全局变量 num:

        #!/usr/bin/python3
        num = 1
        def fun1():
            global num  # 需要使用 global 关键字声明
            print(num)
            num = 123
            print(num)
        fun1()

    以上实例输出结果:
        1
        123

    如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:

        #!/usr/bin/python3
        def outer():
            num = 10
            def inner():
                nonlocal num   # nonlocal关键字声明
                num = 100
                print(num)
            inner()
            print(num)
        outer()

    以上实例输出结果:
        100
        100
    另外有一种特殊情况,假设下面这段代码被运行:

        #!/usr/bin/python3
        a = 10
        def test():
            a = a + 1
            print(a)
        test()

    以上程序执行,报错信息如下:

        Traceback (most recent call last):
          File "test.py", line 7, in <module>
            test()
          File "test.py", line 5, in test
            a = a + 1
        UnboundLocalError: local variable 'a' referenced before assignment

    错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。

posted @ 2018-12-17 21:28  SilentKiller  阅读(996)  评论(0编辑  收藏  举报