变量作用规则
在 Python 中,变量作用,也即变量的查找,遵循 LEGB 规则:
L
o
c
a
l
→
E
n
c
l
o
s
e
d
→
G
l
o
b
l
a
→
B
u
i
l
t
−
i
n
Local\rightarrow Enclosed\rightarrow Globla\rightarrow Built-in
Local→Enclosed→Globla→Built−in
其中:
Local
:局部空间Enclosed
:闭包空间Global
:代码文件全局空间Built-in
:内建空间,最外层
在 Python 中两个变量作用域关键字:
global
nonlocal
global
如果我们在一个函数中进行这样的操作:
x = 1
def func1():
x = x + 1 # error
print(x)
这时将会抛出错误:
Error: reference before assignment
对于全局变量来说,在局部空间内当且仅当可变变量(例如 list
)可以修改,不可变变量将会报错,当:
y = []
def func2():
# 可变类型
y.append(1)
print(y) # output [1]
如果希望对不可变变量进行修改,则需要用 global
关键字指定变量空间:
x = 1
def func3():
global x = x + 1
print(x) # output 2
nonlocal
nonlocal
和 global
类似,但是 global
是直接查找全局变量,而 nonlocal
则是从当前的局部空间往外查找,例如下面的一个嵌套函数:
message = 'global'
def func():
message = 'nonlocal'
def func_sub1():
global message
print(message)
def func_sub2():
nonlocal message
print(message)
func_sub1()
func_sub2()
func()
这时输出将会是:
global
nonlocal
可以看到,nonlocal 找到的是嵌套函数外层的变量空间中的 'messsage'
。
例子
message = 'global'
def TestVariableScope():
message = 'nonlocal'
def _local():
message = 'local'
print(message)
def _nonlocal():
nonlocal message
print(message)
def _global():
global message
print(message)
_local()
_nonlocal()
_global()
def main():
TestVariableScope()
if __name__ == '__main__':
main()
输出:
local
nonlocal
global