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关键字则会出错
在代码中如果碰到一个标志符(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关键字则会出错
相关文章推荐
- Python学习-机器学习实战-ch04 Bayes
- python 元类的使用(orm框架搭建)
- A Byte of Python 笔记(2)基本概念:数、字符串、转义符、变量、标识符命名、数据类型、对象
- python 实现下载图片
- Python基础知识:构造函数中self用法
- python 中文乱码问题深入分析
- Python基础知识:python模块的引入方法
- 二分查找 python实现
- Python学习笔记:详解random模块和time模块
- [LeetCode]题解(python):132-Palindrome Partitioning II
- [LeetCode]题解(python):131-Palindrome Partitioning
- 解析机器中加减法对于二进制补码的运用(附python代码)
- 转载一篇优秀的关于python的字典的文章
- Python爬网页,中文输出乱码问题
- python 全局变量
- python list tuple if for while
- Python项目实战:个人博客(1)
- python中len()的用法
- python中的类型转换
- python2.7:return func name and lineno