??例如我们常用的内置函数
print
len
input
x = 1 #全局名称空间
def foo(): #全局名称空间
y = 2
??注意,"if"下面的定义的变量名都是全局的
if 1 > 0
z = 3 #全局
if 3 > 0:
p = 555 #全局
def f()
x = 222 #局部名称空间
f() #函数调用结束失效
‘内置名称空间‘----->‘全局名称空间‘----->‘局部名称空间‘
‘局部名称空间‘----->‘全局名称空间‘----->‘内置名称空间‘
‘局部名称空间‘----->‘全局名称空间‘----->‘内置名称空间‘
重要概念:名称空间的嵌套关系是在函数定义阶段(检测语法)时确定的,与函数调用的位置无关,与函数定义位置有关
三种名称空间必须要有的是 : 内置名称空间, 全局名称空间
查找优先级示例
??从"f2"局部开始找
x = 3
def f1():
x = 2
def f2():
x =1
print(x)
f2()
f1() # 1
??将"f2"局部的删除,就往上一层找,找到"f1"
x = 3
def f1():
x = 2
def f2():
print(x)
f2()
f1() # 2
??再将"f1"里面的删除,于是找到了全局
x = 3
def f1():
def f2():
print(x)
f2()
f1() # 3
??在定义"f2"的之后,有定义了同一级别的"len",所以当打开函数"f2"运行的时候,本着优先级查找就先找到了"222"
len = 111
def f1():
def f2():
print(len) # 222
len = 222
f2()
f1() # 222
??在全局空间定义一个变量"x",函数"foo",在函数内部修改"x"的值
x = 111
def foo():
x = 222
foo()
print(x) #111
#发现并无软用
??使用"global"关键字之后
x = 111
def foo():
global x # 声明下面的"x"属于全局
x = 222
foo()
print(x) #222
#发现成功了
??不做任何处理,此函数应该是打印"f2"函数下的"x = 333"
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
f3()
print(x) #333
f2()
f1() # 333
??使用"nonlocal"关键字
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
nonlocal x #将下面的"x = 444"变成了上一层的"x"的值
x = 444
f3()
print(x)
f2()
f1() # 444
??如果外层函数都没有"x"这个值,报错
x = 111 #并不会去全局修改
def f1():
def f2():
def f3():
nonlocal x
x = 444
f3()
print(x)
f2()
f1() #报错
原文:https://www.cnblogs.com/songhaixing/p/14051159.html