为什么 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
?这是未知的。这就是此代码失败的原因。
您还应该注意到,在您的第一个片段中,函数内部的 z
与 z=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
这两段代码,为什么第二段会报局部变量赋值错误?两个代码相似只是函数参数不同,在第二个代码中它能够读取全局变量,为什么在第一个代码中不能读取参数名称改变符号 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
?这是未知的。这就是此代码失败的原因。
您还应该注意到,在您的第一个片段中,函数内部的 z
与 z=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