gpt4 book ai didi

Python:更改值 'in place' 的函数?

转载 作者:太空狗 更新时间:2023-10-29 21:58:38 25 4
gpt4 key购买 nike

我想实现一个允许其参数值“就地”重新分配的函数。

例如,一个函数将增加参数 x 并减少参数 y。 (这只是一个简单的说明示例 - 动机是 XY 实际上是大型数据框的单个元素;它们的表达式很笨重;并且此操作将经历多次迭代。)

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 的最终值?

在 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] 和 list_b[0] 是同一个对象,但 number 是不同的那是因为我们复制了 number 的值而不是引用。我建议您使用第一种解决方案。我希望这对您有所帮助。

关于Python:更改值 'in place' 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22338671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com