我试图对列表的可变性如何在Python中运行起来更加直观。特别是,我对this source中的陈述感到困惑:
如果您需要按字母顺序或数字顺序对列表进行排序,那么Python也会对您进行排序。只需调用列表中的sort()方法,它将以新的顺序保存。这将覆盖之前的列表,因此如果您需要保留原始列表,请创建要排序的副本。
我不确定我是否理解如何以粗体显示该部分。以下是我所说的一个例子:
>>> x = [3,2,1,0]
>>> y = x
>>> x
[3,2,1,0]
>>> y
[3,2,1,0]
>>> y.sort()
>>> y
[0,1,2,3]
>>> x
[0,1,2,3]
所以我创建了一个要排序的副本,然后对副本进行了排序,但这改变了原始列表。因此,我对上述引用的含义感到困惑。我不知道这是如何“保留原始”。是否有特殊的复制方式?感谢。
答案 0 :(得分:2)
使用y = list(x)
创建新列表。否则,您只需获得对同一列表对象的新引用。
答案 1 :(得分:1)
答案 2 :(得分:1)
你应该想到这些陈述
x = [3,2,1,0]
y = x
将对x指向的列表对象的引用复制到y。
由于两个变量都是对同一个对象的引用,因此排序y会导致对x和y指向的对象进行排序。
要实现您想要的行为,使用创建列表的排序副本的函数会更容易
y = sorted(x)
或正如文档所述,首先创建副本并对副本进行原样排序
y = x[:]
y.sort()
y = list(x)
y.sort()
答案 3 :(得分:1)
当您说y = x
时,您不仅仅是将x
中的数据复制到y
;您将名称y
分配给x
指向的相同基础数据。也就是说,您只是生成了另一个名称y
,用于引用x
已引用的数据。因此,当您致电y.sort()
时,您也会无意中对x
进行排序,因为它们会引用相同的基础数据。
您可以复制x
引用的数据,并使用y
或y = list(x)
引用名称为y = x[:]
的副本,然后排序y
影响x
,因为它们是真正不同的对象。或者,您可以使用非变异排序功能:x_sorted = sorted(x)
。
答案 4 :(得分:0)
您应该查看shallow copy
和deep copy
是什么。这应该能够为您解决为什么您的复制方式无效。
参考:https://docs.python.org/2/library/copy.html
因此,当您说y = x
时,这意味着您正在复制引用。但不完全创建具有不同引用的另一个列表。
y = copy.deepcopy(x)
是深层副本,会为y.
创建另一个引用,因此修改y
不会更改x.
中的任何值