名称空间分为三种:
一、内置名称空间
存放的名字:存放的Python解析器内置的名字
存活周期:Python解析器启动则产生,Python解析器关闭则销毁
例如:int、input…
二、全局名称空间
存放的名字:除去函数内定义、内置的,剩下的都是全局名称空间的名字
存活周期:Python文件执行则产生,Python文件运行完毕后则销毁
三、局部名称空间
存放的名字:在调用函数时,运行函数体代码过程中产生函数的名字
存活周期:在调用时存活,函数调用完毕后则销毁
四、顺序
加载顺序:内置名称空间>全局名称空间>局部名称空间
销毁顺序:局部名称空间>全局名称空间>内置名称空间
查找顺序:当前所在位置向上一层一层查找
如果当前在局部空间:局部名称空间—>全局名称空间->内置名称空间
如果当前在全局名称空间:全局名称空间->内置名称空间
示例1:
def func():
print(x)
x = 111
func() # x在调用函数之前被定义成全局变量,全局名称空间
结果:
111
示例2:
x = 1
def func():
print(x) # 名称空间的“嵌套”关系是以函数定义阶段为准,与调用位置无关
def foo():
x = 22222222222
func()
foo()
结果:
1
示例3:
input = 1111111111
def func_1():
def func_2():
input = 3333333333
print(input)
input = 2222222222
func_2()
func_1() # 结果:3333333333(调自己的局部名称空间)
input = 1111111111
def func_1():
def func_2():
# input = 3333333333
print(input)
input = 2222222222
func_2()
func_1() # 结果:2222222222(调上一层函数的局部名称空间)
input = 1111111111
def func_1():
def func_2():
# input = 3333333333
print(input)
# input = 2222222222
func_2()
func_1() # 结果:1111111111(调全局名称空间)
# input = 1111111111
def func_1():
def func_2():
# input = 3333333333
print(input)
# input = 2222222222
func_2()
func_1()
结果:
<built-in function input> (调的内置名称空间)
示例4:
x = 111
def func():
print(x) # 虽然语法有问题,但是x仍然取得是局部名称空间
x = 222
func()
结果:
UnboundLocalError: local variable 'x' referenced before assignment