为什么python函数中的全局变量在不同的情况下工作不同?

问题描述 投票:0回答:1
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-3.x global-variables
1个回答
0
投票

因为您正试图重新分配给相同的变量名,所以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
© www.soinside.com 2019 - 2024. All rights reserved.