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关键字则会出错
在代码中如果碰到一个标志符(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关键字则会出错