您的位置:首页 > 编程语言 > Python开发

python中的名称空间

2016-03-28 23:25 736 查看
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关键字则会出错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: