python如何在函数中更改输入变量的值,即使它被分配给另一个变量?

How does python change the value of input variable in a function even when it's assigned to another variable?

本问题已经有最佳答案,请猛点这里访问。

我想定义一个以列表x为输入变量的函数,假设我想在执行函数后保持输入变量(x)的值不变,我想我应该做的是将输入变量(x)的值赋给另一个变量(y),并对这个新变量(y)进行计算,最后返回y。ping输入变量x不动(这是代码中的第二个函数)。

实现该代码会得到相同的结果,就好像我没有添加新的变量y并在y上执行计算一样。x的值会改变。(其结果与第一个函数相同)

我发现,通过构造一个空列表y,然后将x的值一个一个地添加到y,然后对y执行操作,间接地将x的值赋给y,就可以解决这个问题(如代码中的第三个函数)。

我的问题是,为什么python要这样做?当我把x的值赋给y并对y进行计算时,x是否保持不变?我错过了什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

what am I missing?

问题在于Python变量的工作方式。当您将列表x分配给变量y时,您会看到没有创建x的副本。而是创建对列表x的引用。这意味着当变量发生变化(xy时,它们都会发生变化,因为它们都指向完全相同的列表。

您需要显式地告诉python创建一个x的副本到变量y。这样,两个变量将相互独立:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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]
>>>