为什么 python 无法访问函数参数名称更改的全局变量值?

why python can't access global variable value with function parameter name change?

这两段代码,为什么第二段会报局部变量赋值错误?两个代码相似只是函数参数不同,在第二个代码中它能够读取全局变量,为什么在第一个代码中不能读取参数名称改变符号 table?

第一个:

def a(z):
    z+=1
z=3
a(z)

第二个:

def a(z):
    b += 1
b = 5
a(b)

您应该将 def 个块视为独立的块。

在第一个片段中:

def a(z):
    z+=1

什么是z?是a

的第一个参数

在第二个片段中:

def a(z):
    b += 1

什么是b?这是未知的。这就是此代码失败的原因。

您还应该注意到,在您的第一个片段中,函数内部的 zz=3:

不同
>>> def a(z):
...     z+=1
...
>>> z=3
>>> a(z)
>>>
>>> z
3

这里没有使用任何全局变量。

在第一个示例中,z 是函数的参数,而不是全局参数。请注意,当您递增 z 时,它不会在调用范围内发生变化,因为函数内部的 z 是您从函数外部传入的 z 的副本。

在第二个例子中,函数内部没有b(参数是z),这就是为什么当你试图修改它时,函数内部会出错。

要完成您想要做的事情,您应该使参数成为一个可变对象,其中包含您试图改变的值;这样你就可以修改函数内部的值,调用者将可以访问新值。您可以为此目的定义一个 class,或者您可以简单地使其成为一个单元素列表:

def a(z):
    z[0] += 1
b = [5]
a(b)  # b == [6]

或者,如果可能的话,IMO 更好的方法是不依赖可变性,而只 return 新值,要求调用者在其范围内显式重新分配它:

def a(z)
    return z + 1
b = 5
b = a(b)  # b == 6

在第二个代码中,参数是“z”,而您试图用“b”访问该参数

def a(z):
    b += 1