nonlocal 关键字
nonlocal和global这两个关键字很相似,区别在于他们声明函数的区域不同。
nonlocal 用来声明嵌套函数外层的局部变量。
global 用来声明全局变量。
【操作】使用 nonlocal 声明外层局部变量
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("print a:",a)
运行结果:
inner b: 10
outer b: 20
print a: 1000
LEGB 规则
Python 在查找“名称”时,是按照 LEGB 规则查找的:
Local–>Enclosed–>Global–>Built in
Local | 指的就是函数或者类的方法内部 |
---|---|
Enclosed | 指的是嵌套函数(一个函数包裹另一个函数,闭包) |
Global | 指的是模块中的全局变量 |
Built in | 指的是 Python 为自己保留的特殊名称。 |
如果某个 name 映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域(enclosed)进行搜索,如果闭包作用域也没有找到,Python 就会到全局(global)命名空间中进行查找,最后会在内建(built-in)命名空间搜索 (如果一个名称在所有命名空间中都没有找到,就会产生一个 NameError)。