我有一个函数,我使用局部变量,然后在函数完成后传回最后一个变量。我想记录该变量在函数之前的含义,但全局变量与局部变量一起更新。这是我的代码的缩写版本(很长)
def Turn(P,Llocal,T,oflag):
#The function here changes P, Llocal and T then passes those values back
return(P, Llocal, T, oflag)
#Later I call the function
#P and L are defined here, then I copy them to other variables to save
#the initial values
P=Pinitial
L=Linitial
P,L,T,oflag = Turn(P,L,T,oflag)
我的问题是L和Linitial都在Llocal更新时完全更新,但我希望Linitial不会改变。 P没有改变,所以我对这里发生的事感到困惑。救命?谢谢!
勇敢的人的整个代码在这里:https://docs.google.com/document/d/1e6VJnZgVqlYGgYb6X0cCIF-7-npShM7RXL9nXd_pT-o/edit
答案 0 :(得分:2)
问题是P和L是names
bound
到objects
,而不是值本身。当您将它们作为参数传递给函数时,您实际上是将绑定的副本传递给P和L.这意味着,如果P和L是可变对象,则对它们所做的任何更改都将在函数调用之外可见
您可以使用copy模块保存名称值的副本。
答案 1 :(得分:1)
列表是可变的。如果将列表传递给函数并且该函数修改了列表,那么您将能够看到绑定到同一列表的任何其他名称的修改。
要解决此问题,请尝试更改此行:
L = Linitial
到此:
L = Linitial[:]
此切片生成列表的浅表副本。如果您在L
中存储的列表中添加或删除项目,则不会更改列表Lintial
。
如果要制作深层副本,请使用copy.deepcopy
。
P
也不会发生同样的事情,因为它是一个整数。整数是不可变的。
答案 2 :(得分:0)
在Python中,变量只是对内存中对象或值的引用。例如,当您有一个列表x
:
x = [1, 2, 3]
因此,当您将x
分配给另一个变量时,我们称之为y
,您只是为y
引用的对象创建新引用(x
) ([1, 2, 3]
列表)。
y = x
更新x
时,实际上是在更新x
指向的对象,即列表[1, 2, 3]
。由于y
引用相同的值,它似乎也会更新。
请记住,变量只是对象的引用。
如果你真的想要复制一个列表,你应该这样做:
new_list = old_list[:]