nonlocal、Global的总结

在Python中,当引用一个变量的时候,对这个变量的搜索是按找**本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)**的顺序来进行的,即所谓的LEGB规则。

然而当在一个函数内部为一个变量赋值时,并不是按照上面所说LEGB规则来首先找到变量,之后为该变量赋值。在Python中,在函数中为一个变量赋值时,有下面这样一条规则:

“当在函数中给一个变量名赋值是(而不是在一个表达式中对其进行引用),Python总是创建或改变本地作用域的变量名,除非它已经在那个函数中被声明为全局变量. ”

global适用于 函数内部 修改全局变量的值—全局作用域不仅限在类中,不是类也可以用。但是不同类不可以用
nonlocal适用于 嵌套函数 中内部函数修改外部变量的值

使用global关键字修饰的变量之前可以并不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在,否则会报错。

def f1():
    a = 250
    def f2():
        nonlocal a  # 告诉python,要使用和修改的是外部的a
        a = 520
    f2()
    print(a)
f1()   # 输出 520
x = 1
def f1():
    global x  # 函数内部修改全局变量
    x = 2
f1()
print(x)  #输出 2

猜你喜欢

转载自blog.csdn.net/caihuanqia/article/details/113913690