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

posted on 2020-03-18 11:10  麦克煎蛋  阅读(218)  评论(0编辑  收藏  举报