Python访问变量时,有个LEGB原则,也就是说,变量访问时搜索顺序为:Local —>Enclosing—> Global —>Builtin。其实,很多语言也是这样处理的。
简单地说,访问变量时,先在当前作用域找,如果找到了就使用;如果没找到就继续到外层作用域看看有没有,找到了就使用;如果还是没找到就继续到更外层作用域找,如果已经到了最外层作用域了还是实在找不到就看看是不是内置对象,如果也不是,抛出异常。
Python 变量作用域的规则是 LEGB
LEGB含义解释:
L —— Local(function);函数内的名字空间
E —— Enclosing function locals;外部嵌套函数的名字空间(例如closure)
G —— Global(module);函数定义所在模块(文件)的名字空间
B —— Builtin(Python);Python内置模块的名字空间
local()函数
locals() :以字典类型返回当前位置的全部局部变量。
globals()函数
globals() :以字典类型返回当前位置的全部全局变量。
关键字nonlocal
nolocal自内向外依次检索嵌套函数,但不包括全局名字空间;
如果多层嵌套函数存在同名变量,按就近原则处理;
nonlocal不能为外层嵌套函数新建变量;
关键字global
关键字global指向全局名字空间;
参考:
https://blog.csdn.net/oh5w6hinug43jvrhhb/article/details/78610969
https://www.cnblogs.com/yvivid/p/python_LEGB_1.html
https://blog.csdn.net/tcy23456/article/details/82752939