我想定义一个函数,其中列表 x是其输入变量,假设我想在执行函数后使输入变量(x)的值保持不变,我认为我应该做的是将输入变量(x)的值赋给另一个变量(y)并对这个新变量(y)进行计算并在结尾处返回y,保持输入变量x不变(这是第二个函数)代码)。
实现该代码会产生相同的结果,就像我没有添加新变量y并在y上执行计算一样。 x的值改变了。 (它给出与第一个函数相同的结果)
我发现通过构造一个空列表y,然后将x的条目逐个添加到y然后在y上执行操作来间接地将x的值分配给y来解决问题(如第三个代码中的函数)。
我的问题是,为什么python会这样做?难道不是这样的情况,当我将x的值赋给y并对y进行计算时,x保持不变?我错过了什么?
def li(X):
X.append(1)
return(X)
def le(X):
Y=X
Y.append(1)
return(Y)
def lo(X):
Y=[]
for i in range(X):
Y.append(X[i])
Y.append(1)
return(X)
答案 0 :(得分:2)
我错过了什么?
你的问题在于Python变量的工作方式。您会看到,当您将列表x
分配给变量y
时,您未创建x
的 副本 。而是在列表x
中创建 引用 。这意味着当任一变量发生变化(x
或y
)时,它们都会发生变化,因为它们都指向完全相同的列表。
您需要显式告诉Python为变量x
创建y
的副本。这样,两个变量将彼此独立:
>>> x = [1, 2, 3]
>>>
>>> def change(x):
... y = x[:] # create a copy of x and not a reference
... y.append(4) # change the copy
... return y
...
>>> x # before change
[1, 2, 3]
>>> change(x)
[1, 2, 3, 4]
>>> x # after change
[1, 2, 3]
>>>