我希望实现一个函数,允许对其参数的值进行“原地”重新分配。
例如,一个函数将增加参数x并减少参数y。(这只是一个简单的例子,用于说明 - 动机是X和Y实际上是大型数据帧的单个元素;它们的表达式很难处理;而且此操作将经历多次迭代。)
def incdec(x,y,d):
x += d
y -= d
理想情况下,应该运行为:
X = 5; Y = 7; d = 2
incdec(X,Y,d)
现在发现值为X=7和Y=5。但当然事情不是那么简单 - 我想知道为什么?
我希望实现一个函数,允许对其参数的值进行“原地”重新分配。
例如,一个函数将增加参数x并减少参数y。(这只是一个简单的例子,用于说明 - 动机是X和Y实际上是大型数据帧的单个元素;它们的表达式很难处理;而且此操作将经历多次迭代。)
def incdec(x,y,d):
x += d
y -= d
理想情况下,应该运行为:
X = 5; Y = 7; d = 2
incdec(X,Y,d)
现在发现值为X=7和Y=5。但当然事情不是那么简单 - 我想知道为什么?
在Python中,当一个带有参数的函数被调用时, 参数的值的副本被存储在局部变量中。 实际上,当你写:
def incdec(x,y,d):
x += d
y -= d
唯一变化的是函数中的 x 和 y 参数。但在函数结束时,局部变量会丢失。为了获取所需的值,您应该记住函数执行的操作。为了在函数结束后记住这些值,您应该像这样重新赋值 x 和 y:
def incdec(x,y,d):
x += d
y -= d
return (x,y)
# and then
X = 5; Y = 7; d = 2
X,Y = incdec(X,Y,d)
这可以起作用是因为X和Y是int类型。另外,你也可以使用列表来直接访问要更改的变量。
def incdec(list_1,d):
list_1[0] += d
list_1[1] -= d
#no return needed
# and then
X = 5; Y = 7; d = 2
new_list = [X, Y]
incdec(new_list,d) #the list has changed but not X and Y
不要误会,即便是之前提到的传递的参数仍然是一个副本,但当你复制一个列表时,只有引用被复制了,但它们仍然指向同一个对象。以下是一个演示:
number = 5
list_a = [number] #we copy the value of number
print (list_a[0]) # output is 5
list_b = list_a # we copy all references os list_a into list_b
print(list_b[0]) # output is 5
list_a[0]=99
print(list_b[0]) # output is 99
print(number) # output is 5
正如您所看到的,list_a[0]
和list_b[0]
是同一个对象,但数字不同。这是因为我们复制了number
的值而不是引用。我建议您使用第一种解决方案。希望这能帮助到您。