我有以下代码,我想知道为什么它返回相同的列表而不是副本:
x = [2,1,3]
y = x
y.sort()
print y
print x
为什么返回相同的排序列表?
答案 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[:]