Python的命名空间和作用域
来源:互联网 发布:markdown软件 编辑:程序博客网 时间:2024/04/29 12:26
1. 命名空间的定义
Python命名空间是名称到对象的映射,这就像是字典,键名是变量名,值是变量的值。比如:
>>> x = 3>>> globals(){'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'x': 3, '__package__': None}
可以看到变量x,3以字典的形式存放在globals空间内。以之对应的名字空间还有:locals()。
>>> locals(){'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'x': 3, '__package__': None}实际上,你可以通过向名字添加键名和值:
>>> globals()['y'] = 5>>> y5
2. 命名空间的种类
Python中有三种命名空间:
a) 局部,函数内的命名空间就是局部的;
b) 全局,模块内的命名空间就是全局的;
c) 内置,包括异常类型、内建函数和特殊方法,可以代码中任意地方调用;
下面讨论关于名字空间的搜索顺序,先来看张图:
上图左侧是内置命名空间,右侧是不同的模块,有各自的全局命名空间,全局命名空间内定义函数就会有局部命名空间。
3. 命名空间的可见性(作用域)
a) 内置命名空间在代码所有位置都是可见的,所以可以随时被调用;
b) 全局命名空间和局部命名空间中, 如果有同名变量,在全局命名空间处,局部命名空间内的同名变量是不可见的;
c) 在局部命名空间处,全局命名空间的同名变量是不可见的(只有变量不同名的情况下,可使用 global关键字让其可见)。
知道了可见性,下面说变量的查找顺序就要清楚多了。
4. 命名空间的查找顺序
a) 如果在函数内调用一个变量,先在函数内(局部命名空间)查找,如果找到则停止查找。否则在函数外部(全局命名空间)查找,如果还是没找到,则查找内置命名空间。如果以上三个命名都未找到,则抛出NameError 的异常错误。
b) 如果在函数外调用一个变量,则在函数外查找(全局命名空间,局部命名空间此时不可见),如果找到则停止查找,否则到内置命名空间中查找。如果两者都找不到,则抛出异常。只有当局部命名空间内,使用global 关键字声明了一个变量时,查找顺序则是 a) 的查找顺序。
0 0
- python的命名空间和作用域
- Python的命名空间和作用域
- Python 作用域和命名空间
- Python作用域和命名空间
- Python命名空间和作用域窥探
- Python命名空间和作用域
- Python学习笔记:作用域和命名空间
- 函数和类的作用域及命名空间
- 关于C++的命名空间和作用域
- 命名空间作用域
- python的命名空间和对象
- Python命名空间详解ANDpython中的作用域
- python 函数 本地变量 函数的命名空间 变量的作用域
- python的命名空间
- 命名空间namespace的作用
- C++命名空间 namespace的作用和使用解析
- C++命名空间 namespace的作用和使用解析
- XML DTD和XML SCHEMA以及命名空间的作用
- 杭电ACM2044 一只小蜜蜂...(斐波拉契数列----20140725
- 程序员面试宝典---等长数组
- 牛腩新闻发布系统总结(三)----点滴知识
- C++ primer(第五版) 练习 3.35 个人code
- Lucene的多域查询、结果中查询、查询结果分页、高亮查询结果和结果评分
- Python的命名空间和作用域
- request中的乱码问题
- NoSQL数据库探讨之一 - 为什么要用非关系数据库?
- 使用System.Diagnostics.Stopwatch对程序的运行时间精确地测量
- VIM批量修改数字序号
- JAVA 线程池实战
- IOS总结_实现UIButton的图文混排(一)
- qt-project中关于Qlist的说明
- HDU3306 Another kind of Fibonacci