4

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

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

4

3 回答 3

2

问题是 P 和 L 是namesto boundobjects而不是值本身。当您将它们作为参数传递给函数时,实际上是将绑定的副本传递给 P 和 L。这意味着,如果 P 和 L 是可变对象,则对它们所做的任何更改都将在函数调用之外可见.

您可以使用复制模块来保存名称值的副本。

于 2012-12-26T21:30:18.543 回答
1

列表是可变的。如果您将列表传递给函数并且该函数修改了列表,那么您将能够看到绑定到同一列表的任何其他名称的修改。

要解决此问题,请尝试更改此行:

L = Linitial

对此:

L = Linitial[:]

此切片制作列表的浅表副本。如果添加或删除存储在列表中的项目,L它不会更改列表Lintial

如果要进行深层复制,请使用copy.deepcopy.


同样的事情不会发生,P因为它是一个整数。整数是不可变的。

于 2012-12-26T21:33:38.660 回答
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

于 2012-12-26T21:35:50.263 回答