python中的名称空间

namespace是一个name到object 的映射关系


在代码中如果碰到一个标志符(name),需要有一个规则来决定去哪个namespace查找,这就是LEGB。


LEGB决定了name的查找顺序:locals -> enclosing function -> globals -> __builtins__


locals 是函数内的名字空间,包括局部变量和形参


enclosing 外部嵌套函数的名字空间(闭包中常见)




globals 全局变量,函数定义所在模块的名字空间




builtins 内置模块的名字空间







LGB规则与name space加载的顺序相反,


Python解释器初始化的时候会先加载built-in namespace,它由__builtins__模块的名字构成,


随后加载global namespace。 如果在执行期间调用了一个函数,那么将创建局部名字空间。






Python中一切都是object,包括function、module、class、package,这些objects都有在内存中真真正正的存在。


每个object都有自己的namespace,每个object的namespace是独立的。




可以通过object.__name__的方式访问object的namespace中的name,


不同的namespace中可以使用相同的name,而不会引发混淆。


namespace是动态创建的,每一个namespace的生存时间也不一样。




一个module的namespace是它被import的时候创建的。


而function被调用时,创建其local namespace,调用结束或抛出exception的时候, 该local namespace将被删除。


 


locals( )和globals( )分别返回dictionary结构的global namespace和local namespace,


 


注意:还有一个特殊的module,一进入python解释器,就建立了一个module


这个module的namespace就是global namespace,一个全局唯一的namespace


这个module的一个内部的attribute,__name__等于__main__


如果模块是被导入的,__name__的值为模块的名字;


如果模块是被直接执行的,__name__的值为’__main__’


scope(作用域):


用unqualified reference name(即与object.name相比,没有object的前缀)就可以直接找到name所指的对象。 LGB规则用scope的概念来解释就是:在任何代码执行的时候,都至少有3个scope,从内到外一次查找一个unqualified reference name。


函数体内的局部变量和全局变量如果重名,全局变量不可见(被局部变量覆盖)
 


当在函数中需要修改全局变量时,如果没有global关键字则会出错
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值