参考tutorial.pdf 9.2 Python 作用域和命名空间
总结:
只有在def一开始就声明的一个变量,他与上次的同名变量没有任何关系,可以随意使用
如果在def中未声明而直接使用一个变量,他会向上寻找,使用第一次遇到的同名变量的数值,不能赋值。只能只读,如果该变量是list,可以执行一些方法的操作。
global和nonlocal,是一种特殊的同步变量名的方式,同样使用前,这层def中不能用过该变量名
nonlocal的上层不能是主体,nonlocal向上追溯直至第一层def,需要有一个独立的变量名,如总结1,如果期间先遇到global 变量,报错
global,可以理解为在主体中声明该变量,如果主题中有了,就同时使用其空间和数值,如果没有,就在主题中没有,就算是在主体中新建了一个未赋值变量,而这层函数和主体同名或新建函数一心同体。只是下层不能用nonlocal调用这个变量
因为过程太长,所以转开一小篇文章存放总结:python - 官方简易文档篇(1)
def a0():
print(a)
def a1():
a=1
print(a,"a11")
def a2():
a=2
print(a,"a21")
def a3():
def a4():
nonlocal a
a=3
a4()
a3()
print(a,"a22")
a2()
print(a,"a12")
a1()
print(a)
a=0
a0()
#
0
1 a11
2 a21
3 a22
1 a12
0
def 局部变量测试():
局部变量="这里是默认的局部变量"
print(局部变量)
global 变量1
print(变量1+",global到了函数里面")
#这里是程序开头
变量1="这里是全局范围定义的变量"
print(变量1)
局部变量测试()
#
这里是全局范围定义的变量
这里是默认的局部变量
这里是全局范围定义的变量,global到了函数里面
def 局部变量测试():
变量2="testd"
def 再测试():
nonlocal 变量2
变量2="这是什么"
再测试()
print(变量2)
变量2="testg"
局部变量测试()
print(变量2)
#
这是什么
testg
def 局部变量测试():
变量2="testd"
def 再测试():
# def 再再测试():
# nonlocal 变量2
# 变量2="这是什么"
# 再再测试()
print(变量2)
def 额():
print(变量2)
额()
再测试()
print(变量2)
变量2="testg"
局部变量测试()
print(变量2)
def d1():
print(a)
def d2():
a="d2"
print(a)
def d3():
nonlocal a
a="na"
print(a)
def d4():
global a
print(a)
def d5():
a="bn"
print(a,"d5")
d5()
a="d4+"
print(a,"d42")
d4()
d3()
print(a,"d22")
d2()
print(a,"d12")
a="a"
print(a)
d1()
print(a)
#
a
a
d2
na
a
bn d5
d4+ d42
na d22
d4+ d12
d4+
def 局部变量测试():
局部变量="这里是默认的局部变量"
print(局部变量)
global 变量1
变量1="哈哈"
print(变量1+",global到了函数里面")
#这里是程序开头
局部变量测试()
print(变量1)
这里是默认的局部变量
哈哈,global到了函数里面
哈哈
即便主体没有声明变量,只需要在调用该变量之前,在def中用glocal声明了也可以 的说!
结论:
全局可以看作最外层的明明空间
如果第一层def中设定了同名变量没有赋值,或者没有定义变量,是可以直接调用上一级的改名变量的,上一级没有就上上级,直到遇到该变量,使用其数值,但是这里的使用其数值是只读状态,这层def中,对于该同名变量的赋值是不会影响上级变量的。
如果此时上级变量是个list等可修改组合数据,使用append等原地操作会报错。
nonlocal:非局部,这里可以理解为不止当层def,会追溯到上层变量名,上层没有就报错,上层有的话就同时修改了上层变量的数据!上层有,是指要赋值,没有赋值的变量是无效的。
第一层无法使用nonlocal,同样报错:SyntaxError: no binding for nonlocal ‘a’ found
总结:nonlocal在第二层及更下层的def使用,与上层同名变量同数值。
global,与主体变量名同同心同体。若下层def未命名而直接调用同名变量,也可参照该变量的数值。
nonlocal,影响上层,本层,下层未声明。从第二层def开始使用,上层无该变量或者该变量是global等非上层def原生声明的变量,报错。no binding for nonlocal ‘变量名’ found
global,影响本体,本层,下层未声明。声明前,不得使用该变量。
变量=0
def
变量:0
def
变量:0
def
变量=1
def
变量:1
变量=2 #UnboundLocalError: local variable '变量' referenced before assignment
#如果打算赋值该变量,那就在声明前不要使用
#
变量=[1,2,3]
def
def
变量.append(4)
变量:[1,2,3,4]
#1
def
变量=0
def
def
nonlocal 变量 #向上追溯变量,直到遇到变量,执行。直到追溯到第一层def。直到遇到global。
变量=1
变量:1
变量:1
#2
def
def
nonlocal 变量
#no binding for nonlocal '变量' found
#3
[变量=0] #这个变量不定义也可以,只需要在该主体调用他前,在def中global该变量即可
def
#变量=1 #SyntaxError: name 'a' is assigned to before global declaration
global 变量 #全局声明前不要使用该变量
def
#nonlocal 变量 #no binding for nonlocal '变量' found nonlocal无法调用global的变量
变量