我希望实现一个函数,允许其参数的值重新分配到位[']。
作为一个例子,一个函数将增加参数 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.但当然它不会那样工作 - 我想知道为什么?< / p>
答案 0 :(得分:1)
在Python中调用带参数的函数时 参数值的副本存储在局部变量中。 确实在你写的时候
def incdec(x,y,d):
x += d
y -= d
唯一改变的是函数indec中的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] and list_b[0]
是同一个对象,但数字是不同的
那是因为我们复制了number
的值而不是参考。
我建议你使用第一个解决方案。
我希望这会有所帮助。