Python:如何在函数中就地修改值?
我想实现一个函数,让它能够直接在原地重新分配参数的值。
举个例子,假设有一个函数,它会把参数 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。但实际上并不是这样,我在想这是为什么呢?
1 个回答
4
为什么你的函数没有改变X和Y的最终值?
在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
的值,而不是它的引用。
我建议你使用第一种解决方案。希望这对你有帮助。