LEGB规则

Posted windyrainy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LEGB规则相关的知识,希望对你有一定的参考价值。

链接:https://www.cnblogs.com/GuoYaxiang/p/6405814.html

命名空间

大约来说,命名空间就是一个容器,其中包含的是映射到不同对象的名称。你可能已经听说过了,Python中的一切——常量,列表,字典,函数,类,等等——都是对象。
这样一种“名称-对象”间的映射,使得我们可以通过为对象指定的名称来访问它。举例来说,如果指定一个简单的字符串  a_string = "Hello string",我们就创建了一个对象“Hello string”的引用,之后我们就可以通过它的名称a_string来访问它。

命名空间也有不同的层次(也就是所谓的“作用域”)

通过LEGB规则对变量名进行作用域解析

我们已经知道了多个命名空间可以独立存在,而且可以在不同的层次上包含相同的变量名。“作用域”定义了Python在哪一个层次上查找某个“变量名”对应的对象。接下来的问题就是:“Python在查找‘名称-对象’映射时,是按照什么顺序对命名空间的不同层次进行查找的?”

答案就是:使用的是LEGB规则,表示的是Local -> Enclosed -> Global -> Built-in,其中的箭头方向表示的是搜索顺序。


Local 可能是在一个函数或者类方法内部。
Enclosed 可能是嵌套函数内,比如说 一个函数包裹在另一个函数内部。
Global 代表的是执行脚本自身的最高层次。
Built-in 是Python为自身保留的特殊名称。


因此,如果某个name:object映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域(enclosed)进行搜索,如果闭包作用域也没有找到,Python就会到全局(global)命名空间中进行查找,最后会在内建(built-in)命名空间搜索(注:如果一个名称在所有命名空间中都没有找到,就会产生一个NameError)。

以上是关于LEGB规则的主要内容,如果未能解决你的问题,请参考以下文章

Python 命名空间与LEGB规则

python——作用域之LEGB规则

Python中的LEGB规则

Python LEGB (Local, Enclosing, Global, Build in) 规则

Python入门-5函数:10nonlocal-global-LEGB规则

初学python命名空间和LEGB原则