11. 名称空间
一、什么是名称空间
名称空间(namespace)指的是变量存储的位置,是对栈区的划分。每一个变量都需要存储到指定的名称空间中。每一个作用域都会有一个它对应的名称空间。名称空间主要分为 内置名称空间、全局名称空间 和 局部名称空间 三种。名称空间实际上就是一个字典,是一个专门用于存储变量的字典。
- 内置名称空间 用来保存 Python 解释器内置的名字。内置名称空间 在 Python 解释器启动时产生,在 Python 解释器关闭时销毁。
- 全局名称空间 用来保存 全局变量(不是函数内定义的名字)。全局名称空间 在 Python 文件执行时产生,在 Python 文件运行完毕后销毁。
- 函数名称空间 用来保存 函数中的变量(在调用函数时,运行函数体代码过程中产生的函数内的名字)。局部名称空间 在调用函数时存活,函数调用完毕后销毁。
def func():
print(x)
x = 10
func()
名称空间的加载顺序:内置名称空间 > 全局名称空间 > 局部名称空间;
名称空间的销毁顺序:局部名称空间 > 全局名称空间 > 内置名称空间;
名字的查找优先级:当前所在的位置向上一层一层查找;
二、获取名称空间
我们可以使用 locals() 函数来获取当前作用域的名称空间。
如果在全局作用域中调用 locals() 函数,则获取全局名称空间;如果在函数作用域中调用 locals() 函数,则获取函数的名称空间。locals() 函数返回的是一个字典。我们可以向字典中添加一个 key-value,这相当于在全局中创建了一个变量,但是不建议这样做。
a = 10
scope = locals()
print(scope,'\n')
print(type(scope), '\n')
# 向字典中添加key-value就相当于在全局中创建了一个变量
scope['b'] = 10
print('b = ',b)
在函数内部调用 locals() 会获取函数的名称空间。
def func():
a = 10
scope = locals()
print(scope,'\n')
print(type(scope),'\n')
func()
我们可以使用 globals() 函数在任意位置获取全局名称空间。
a = 10
def func():
b = 10
global_scope = globals()
print(global_scope, '\n')
print(type(global_scope), '\n')
print(global_scope['a'])
global_scope['a'] = 30
func()
print(a)