[python] 作用域
Python中查找变量的顺序遵循LEGB
规则(Local->Enclosing->Global->Built-in)。Python中的if/elif/else
、for/while
等代码块不会创建新的作用域,只有def
、class
、lambda
才会改变作用域。这和C++中不同,C++中在{}
代码块中创建的变量离开这个代码块后就会被析构,也即RAII
的精髓所在。因此,Python中在if
或for/while
中创建的变量实际都是函数的局部变量,而不是if
或for/while
的局部变量。
global
与nonlocal
:
- 如果想在函数中修改全局变量,可以在函数中声明
global
; - 如果想在嵌套作用域里修改上一层作用域的
非全局变量
,可以在嵌套作用域中声明nonlocal
。
例子:
k=1
def fun():
i=3
# global k
while i>0:
i-=1
k=3
print(k)
fun()
print(k)
# 不加global输出:
# 3
# 1
# 加global输出:
# 3
# 3
def foo():
k=1
def fun():
i=3
# nonlocal k
while i>0:
i-=1
k=3
print(k)
fun()
print(k)
foo()
# 不加nonlocal输出:
# 3
# 1
# 加nonlocal输出:
# 3
# 3