Python进阶01 命名空间
一、命名空间是什么
官方文档的一段话:
A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。
命名空间是一个字典(dictionary),它的键就是变量名,它的值就是那些变量的值。命名空间的一大作用是避免名字冲突。
各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
二、Python的三种命名空间
名称 |
记录数据 |
局部命名空间(Local namespace) |
记录了函数的参数和局部定义的变量。类中定义的也是。 |
全局命名空间(Global namespace) |
记录了模块的变量,包括函数,类,其他导入的模块,模块级的变量和常量 |
内置命名空间(Built-in namespace) |
Python 语言内置的名称,如存放内置的函数和类,例如:abs、char |
它们的空间范围如下图所示:
三、命名空间的使用
有一个名为vars的内置函数,它返回这个不可见的字典。
>>> x = 1 >>> scope = vars() >>> scope['x'] 1 >>> scope['x'] += 1 >>> x 2
那么有多少个命名空间呢?除全局作用域外,每个函数调用都将创建一个。
内置函数 locals(),返回当前函数的局部命名空间:
x = 100 def fun(): a = 1 b = 2 print(locals()) return a+b fun() 结果: {'a': 1, 'b': 2}
内置函数globals(),返回当前模块的全局命名空间:
x = 100 def fun(): a = 1 b = 2 print(locals()) return a+b fun() print(globals()) 结果: {'a': 1, 'b': 2} {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x107d1f080>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Volumes/DATA/python/python_test/test.py', '__cached__': None, 'x': 100, 'fun': <function fun at 0x107cb3268>}
四、命名空间的查找顺序
当代码要使用变量x的值时,Python解释器回到所有可用的命名空间去查找变量,顺序:
1、局部命名空间:当前函数或者类的方法。如果函数定义了一个局部变量x,解释器使用它,停止搜索。
2、在父函数或嵌套的命名空间中搜索。
3、全局命名空间,搜索当前的模块,如果模块定义了名为x的变量,函数,或者类,解释器使用它。
4、内置命名空间:对每个模块都是全局的,作为最后的尝试,Python将假设x为内置函数或变量。
5、如果 Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'aa' is not defined。
# 命名空间示例
# var1 是全局名称
var1 = 5
def some_func():
# var2 是局部名称
var2 = 6
def some_inner_func():
# var3 是内嵌的局部名称
var3 = 7
五、命名空间的生命周期
1、内置命名空间,Python解释器启动时创建,退出时销毁
2、全局命名空间,模块定义被解释器读入时创建,解释器退出时销毁
3、局部命名空间,函数调用时创建,函数返回或者异常时销毁
参考文章:
https://www.cnblogs.com/goldsunshine/p/10948475.html
https://www.runoob.com/python3/python3-namespace-scope.html