nonlocal
nonlocal
用来在内部函数中,声明外层的局部变量。
#测试nonlocal、global关键字的用法
a = 100
def outer():
b = 10
def inner():
nonlocal b #声明外部函数的局部变量
print("inner b:",b)
b = 20
global a #声明全局变量
a = 1000
inner()
print("outer b:",b)
outer()
print("a:",a)
LEGB规则
Python在查找“名称”时,是按照LEGB规则查找的:
Local——> Enclosed——>Global——>Built in.
Local
指的就是函数或者类的方法内部
Enclosed
指的是嵌套函数(一个函数包裹另一个函数,闭包)
Global
指的是模块中的全局变量
Built in
指的是Python为自己保留的特殊名称
如果某个name 映射在局部local 命名空间中没有找到,接下来就会在闭包作用域enclosed
进行搜索,如果闭包作用域也没有找到,Python就会到全局global 命名空间中进行查找,最后会在内建 built-in 命名空间搜索(如果一个名称在所有命名空间中都没有找到,就会产生一个NameError )