在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