名称空间
名称空间是人为的将栈区划分的几个逻辑空间,可分为内置名称空间、全局名称空间、局部名称空间
内置名称空间
内置名称空间定义范围:解释器内定义的名称
作用周期:解释器读入到内存后内置变量会加载到内存;退出解释器则释放其内置名称空间
print(input)
全局名称空间
全局名称空间定义范围:代码中顶级定义的变量,或者除了函数、类中定义的变量,都是在全局名称空间
作用周期:在python解释器开始识别代码语法时产生到代码执行完结束
a=3
print(a)
局部名称空间
局部名称空间定义范围:函数、类内定义的变量属于局部名称空间
作用周期:函数定义阶段只识别其内代码的语法。函数调用时产生,函数调用完成后结束
func():
a=1
b=2
func()
注意: 名称空间之间不是嵌套,是相互独立的,名称空间优先级为:内置名称空间<全局名称空间<局部名称空间
变量首先会从当前名称空间查找相应的变量,没找到则到上一级名称空间查找
print(input)
input=1
def func1():
input=2
print(input)
func1()
print(input)
作用域
全局名称空间和内置名称空间会伴随着代码执行的始终
局部名称空间会伴随函数的调用结束而结束
注意: 名称空间的嵌套关系以及变量的查找顺序是在函数定义阶段就确定的,和函数的调用阶段无关
global 和nonlocal
global:一般用户函数内,将函数内的变量声明为全局变量(可以在局部命名空间中修改全局命名空间的值,更改局部变量的查找路径),
这个变量一般为不可变类型
nonlocal:名称空间的嵌套,从此时所在的局部名称空间之外的局部名称空间查找对应变量