python3 nonlocal vs global

考虑这样一个python程序:

x = 12

def func():

      x = 1

func()

print(x)

输出为:x = 12

因为函数内部定义的x被认为只属于局部作用域,为了表明我么引用的是全局的x而不是新定义一个局部的x,

可以使用global关键字:

x = 12

def func();

    global x

    x = 1

func()

print(x)

可以发现输出已经变成了1,也就是在函数内部成功修改了一个全局变量

还有一种情形,就是嵌套的局部作用域的问题:

def g():

    x = 12

    func():

         x = 1

    func()

    print(x)

g()

这样输出的结果为12,因为func函数调用时定义的X也被认为只属于局部作用域了,但是此时函数g()里定义的x并非全局变量,用前述的global关键字肯定是不行的,

所以又有了nonlocal,这样写:

def g():

     x = 12

     func():

         nonlocal x

         x = 1

     func()

     print(x)

g()

这时,输出的结果就是我们预期的1了,nonlocal就是声明要引用一个外部作用域(全局作用域除外)中定义的变量。

需要指出的是,上述关键字之所以需要,是因为我们试图去修改全局变量或者处于外部作用域的变量,如果在局部作用域内部重定义全局变量或外部作用域变量,仅仅只读访问(比如print出来)是完全没有问题的,参看下面这个例子:

a = 12
def g():
    b = 11
    def func():
        print(a)
        print(b)
    func()
    return
if __name__ == '__main__':
    g()

原文地址:https://www.cnblogs.com/hustxujinkang/p/4605480.html