站长网 语言 LEGB规则是编程语言里必不可少的

LEGB规则是编程语言里必不可少的

四个作用域遵循LEGB规则,让我们用一个例子来说明。 importbuiltins builtins.b=builtins g=global defouter(o1,o2=o2): e=enclose definner(i1,i2=i2): print(i1,i2,o1,o2,e,g,b) returninner fun=outer(o1) fun(i1) 其输出为 i1 i2 o1 o2 enclose global

四个作用域遵循LEGB规则,让我们用一个例子来说明。

import builtins 

 

builtins.b = 'builtins' 

g = 'global' 

 

def outer(o1,o2='o2'): 

    e = 'enclose' 

    def inner(i1,i2='i2'): 

        print(i1,i2,o1,o2,e,g,b) 

    return inner  

 

fun = outer('o1')  

fun('i1') 

其输出为 i1 i2 o1 o2 enclose global builtins

可见,在outer函数的嵌套函数inner中的输出语句 print(i1,i2,o1,o2,e,g,b) 是本程序的重点。其具体执行情况如下:

print i1和i2,毫无疑问的局部变量。

print o1和o2,本地作用域没有,向上查找到outer函数形参。形参也为局部变量,所以该变量实际定义在outer函数内,inner这个内嵌函数外,而inner内部引用了这个变量,所以视为自由变量。

print e,本地作用域没有,类似上例,视为自由变量。

print g,本地作用域没有,自由变量作用域(闭包)没有,一直上溯到全局作用局找到。

print b,本地作用域没有,自由变量作用域(闭包)没有,全局作用局没有,一致上溯到内置变量空间找到。

至此,LEGB规则呼之欲出:在本地空间寻找不到的变量,逐级向上级寻找。这里的LEGB分别指代Local,Enclose,Global和Builtin。

在函数中读取和赋值全局变量,在内嵌函数中读取和赋值自由变量,会有一些不同的地方。

本文来自网络,不代表站长网立场,转载请注明出处:https://www.zwzz.com.cn/html/biancheng/yuyan/2021/0525/6014.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部