Python:局部变量神秘地更新全局变量

时间:2012-12-26 21:23:43

标签: python variables global local

我有一个函数,我使用局部变量,然后在函数完成后传回最后一个变量。我想记录该变量在函数之前的含义,但全局变量与局部变量一起更新。这是我的代码的缩写版本(很长)

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

3 个答案:

答案 0 :(得分:2)

问题是P和L是names boundobjects,而不是值本身。当您将它们作为参数传递给函数时,您实际上是将绑定的副本传递给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[:]

这是一个很好的解释:http://henry.precheur.org/python/copy_list