为什么不分配副本

时间:2011-08-01 21:45:05

标签: python sorting

我有以下代码,我想知道为什么它返回相同的列表而不是副本:

x = [2,1,3]
y = x
y.sort()
print y
print x

为什么返回相同的排序列表?

6 个答案:

答案 0 :(得分:5)

因为它已就地修改。

Python列表具有引用语义,这意味着当您将列表分配给另一个变量时,它们实际上指向同一个列表。

如果您想制作副本,请执行以下操作:

x = [2,1,3]
y = x[:]
y.sort()
print y
print x

slice 表示法确实会导致列表(在这种情况下,整个列表,尽管您可以进行小的修改以请求特定的子列表)。

答案 1 :(得分:4)

您正在使用Python处理引用。声明y = x使y指向与x相同的内容,因此对y的更改会反映在x中(因为它们指向相同的基础列表) )。

您可以通过执行以下操作来更改副本:

y = list(x) # make a copy of the list so we can change y without disturbing x
y.sort()

y = sorted(x) # return a new sorted copy of what is in x

答案 2 :(得分:2)

x是列表(对象)的名称(“引用”)。这条线

y=x

仅为同一列表创建另一个名称。如果要复制列表,请使用

之一
y = x[:]
y = list(x)

(第一种语法只是一个普通的列表切片,但是遗漏了开始值和结束值,这意味着它占据了整个列表。)

请注意,列表是对象列表,复制列表不会复制对象。如果您想要这种行为 - 副本 - 您必须使用

明确地执行此操作
import copy
y = copy.deepcopy(x)

当然,这会慢一些。

答案 3 :(得分:0)

在Python中为另一个变量分配列表会创建一个引用,因此您对引用所做的任何更改都将显示在原始引用中。如果您想要一份不会改变原件的副本,请执行以下操作:

y = x[:]

答案 4 :(得分:0)

因为您只复制了引用。

有关如何克隆列表('深拷贝')的说明,请参阅: How to clone or copy a list?

答案 5 :(得分:0)

当你说y = x时,你真的只是在x的内容中指定另一个名字(y)。如果x是一个可变值并且你做了一些改变它,那么你就改变了只有2个不同名字的唯一拷贝。

防止这种情况的一种常见方法是分配一个切片,该切片始终是原始列表的副本。

y = x[:]