一,namespace
-
namespace是名字到对象的映射,python里面的大部分命名空间由字典实现。如果有性能问题,会更改。
-
命名空间的举例
•存放内置函数的集合(abs()这种函数,和内建的异常)
•模块中的全局名称
•函数调用中的局部名称
•某种意义,对象的属性集合
不同命名空间的名称没得关系,比如两个模块里面都有show()函数,只要指明是哪个模块就行。
-
三种命名空间的区别
• 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。• 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
• 非局部和非全局之间得名称 nonlocal
• 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
命名空间查找顺序:(从小到大)
假设我们要使用变量 BITQIAN,则 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。
如果找不到变量 BITQIAN,它将放弃查找并引发一个 NameError 异常:
int = 0
def test_namespace():
int = 1
def inner_show():
int = 2
print(int)
inner_show()
test_namespace() # 2 local
def test_namesapce():
int = 1
def inner_show():
print(int) # 1 nonlocal
inner_show()
def test_namespace(