专栏名称: Python开发者
人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。
目录
相关文章推荐
Python爱好者社区  ·  立省110亿!百度完成重大收购 ·  昨天  
Python爱好者社区  ·  热议:为什么 DeepSeek ... ·  2 天前  
Python中文社区  ·  新龙出现,干它 ·  3 天前  
Python爱好者社区  ·  AI ... ·  2 天前  
Python中文社区  ·  34万亿“美债危机”黑天鹅要来了?用数据揭晓 ... ·  4 天前  
51好读  ›  专栏  ›  Python开发者

Python 的 LEGB 规则

Python开发者  · 公众号  · Python  · 2017-06-18 20:13

正文

(点击 上方蓝字 ,快速关注我们)


来源:伯乐在线 - 刘志军

foofish.net/python-legb.html

如有好文章投稿,请点击 → 这里了解详情


理解LEGB前,首先需要对Python的作用域、命名空间有一定的了解,话题才能继续展开。


命名空间


命名空间表示变量的可见范围,一个变量名可以定义在多个不同的命名空间,相互之间并不冲突,但同一个命名空间中不能有两个相同的变量名。比如:两个叫“张三”的学生可以同时存在于班级A和班级B中,如果两个张三都是一个班级,那么带来的麻烦复杂很多了,在Python中你不能这么干。


在Python中用字典来表示一个命名空间,命名空间中保存了变量(名字)和对象的映射关系,在Python中命名空间出现在哪些地方呢?有函数范围内的命名空间(local),有模块范围内的命名空间(global),有python内建的命名空间(built-in),还有类对象的所有属性组成的命名空间。


命名空间的生命周期


所有的命名空间都是有生命周期的,对于python内建的命名空间,python解析器启动时创建,一直保留直至直python解析器退出时才消亡。而对于函数的local命名空间是在函数每次被调用的时候创建,调用完成函数返回时消亡,而对于模块的global命名空间是在该模块被import的时候创建,解析器退出时消亡。


作用域


一个作用域是指一段程序的正文区域,可以是一个函数或一段代码。一个变量的作用域是指该变量的有效范围。Python的作用域是静态作用域,因为它是由代码中得位置决定的,而命名空间就是作用域的动态表现。


LGB


Python2.2之前定义了三个作用域,分别是:


  • global作用域,对应的global命名空间,一个模块最外层定义的一个作用域。

  • local作用域,对应local命名空间,由函数定义的。

  • builtin作用域,对应builtin命名空间,python内部定义的最顶层的作用域,在这个作用域里面定义了各种内建函数:open、range、xrange、list等等。


那时的Python作用域规则叫做LEB规则,变量(名字)的引用按照local作用域、global作用域、builtin作用域的顺序来查找。


首先来看一段代码:


a = 1

def foo () :

a = 2

print a // [ 1 ]

print a // [ 2 ]

foo ()


[1]处输出结果为2,Python首先会在函数foo定义的local作用域中查找名字a,如果找到了直接输出,没有没找到就会在模块定义的global作用域中查找,如果还没找到,就到Python内建的builtin作用域中查找a,如果还没找到就报异常:NameError: name ‘a’ is not defined。引用过程如图:



2]处输出结果为1,查找顺序同样是按照LGB规则,只不过这里的local作用域就是global作用域。


LEGB规则


Python2.2开始引入嵌套函数,嵌套函数为python提供了闭包实现。


a = 1

def foo () :

a = 2

def bar () :

print a //







请到「今天看啥」查看全文