即使将输入变量分配给另一个变量,python如何更改函数中输入变量的值? [复制]

Posted

技术标签:

【中文标题】即使将输入变量分配给另一个变量,python如何更改函数中输入变量的值? [复制]【英文标题】:How does python change the value of input variable in a function even when it's assigned to another variable? [duplicate] 【发布时间】:2017-05-24 10:42:35 【问题描述】:

我想定义一个函数,其中 a list x 是它的输入变量,假设我想在执行函数后使输入变量 (x) 的值不变,我认为我应该做的是将输入变量 (x) 的值分配给另一个变量 (y) 并对这个新变量 (y) 进行计算并在最后返回 y 保持输入变量 x 不变(这是第二个函数代码)。

实现该代码给出的结果与我没有添加新变量 y 并对 y 执行计算一样。 x 的值发生了变化。 (它给出的结果与第一个函数相同)

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

我的问题是,python 为什么要这样做?当我将 x 的值分配给 y 并对 y 进行计算时,不应该是这样吗?我错过了什么?

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)

【问题讨论】:

【参考方案1】:

我错过了什么?

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

您需要显式地告诉 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]
>>> 

【讨论】:

好技巧,非常感谢:) @FawzyHegab 非常感谢 Fawzy。

以上是关于即使将输入变量分配给另一个变量,python如何更改函数中输入变量的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当我将一个字典分配给另一个变量时,为啥 Python 会同时更新两个字典? [复制]

如何将数组的变量分配给另一个数组

将结构的第一个变量分配给另一个

是否可以将一个功能“分配”给另一个功能?

将一个枚举类型分配给另一个枚举类型

Python:通过将对象分配给另一个对象来修改它