myGlobal = 5
z=2
def func1(a):
a=1
def func2(a): a=1 myGlobal=z+1 # here it doesnt throw any error print (myGlobal)
func1(z)
func2(z)
myGlobal = 5
z=2
def func1(a):
a=1
def func2(a):
a=1
z=z+1 # here it throws any error stating local variable is not defined
print (myGlobal)
func1(z)
func2(z)
因为您正试图重新分配给相同的变量名,所以python将z视为现在的局部范围,因为在函数内部对其进行了修改,而未将其声明为全局变量。您可以使用dis
在此处查看实际情况。在func1中,您可以看到z
是从全局加载的,但是在第二个func中,由于语法的原因,它认为您引用了z的本地值,因此从z不存在的本地范围加载了它。
myGlobal = 5 z=2 def func1(a): a=z+1 def func2(a): z=z+1 # here it throws any error stating local variable is not defined from dis import dis print(dis(func1)) print("###") print(dis(func2))
输出
5 0 LOAD_GLOBAL 0 (z)
2 LOAD_CONST 1 (1)
4 BINARY_ADD
6 STORE_FAST 0 (a)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
None
###
9 0 LOAD_FAST 1 (z)
2 LOAD_CONST 1 (1)
4 BINARY_ADD
6 STORE_FAST 1 (z)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
None