名称空间与作用域
1. 什么是名称空间和作用域
变量到底是什么,我们从前面学习的知识可知道,定义了一个变量后,变量名就会指向变量值,这种关系与字典很像,变量值存放在变量名指向的内存空间地址,那么变量名存放在什么地方呢?其实在Python中有专门的区域存放变量名,这和空间就称为名称空间。
2. 名称空间
- 内置名称空间:存放Pyhton解释器自带的名字,在python解释器启动时有效,python解释器关闭后失效
- 全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间,在文件执行时生效,文件执行结束后失效
- 局部名称空间:用于存放函数调用期间函数体产生的名字,在文件执行调用函数时生效,函数调用结束后失效
- 加载顺序:内置名称空间 -> 全局名称空间 -> 局部名称空间
- 查找顺序:当前名称空间 -> (内置名称空间 -> 全局名称空间 -> 局部名称空间)
3.作用域
- 全局作用域:全局有效,全局存活,包含内置名称空间和全局名称空间。
- 局部作用域:局部有效,临时存储,只包含局部名称空间。
- 注意:作用域关系在函数定义阶段就固定死了,与函数的调用无关。
- global:修改全局作用域中的变量
def test():
global x
x = 1
x = 3
test()
print(x) # 不申明之前结果为3,申明之后修改为1
- nonlocal:修改局部作用域中的变量。
def test():
x = 1
def test1():
nonlocal x
x = 2
test1()
print(x) # 不申明之前为1,申明之后修改为2
x = 3
test()
print(x) # 3,因为没有申明全局变量,保持不变