对Python中列表可变性的困惑

时间:2017-03-10 17:09:14

标签: python mutable

我试图对列表的可变性如何在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]

所以我创建了一个要排序的副本,然后对副本进行了排序,但这改变了原始列表。因此,我对上述引用的含义感到困惑。我不知道这是如何“保留原始”。是否有特殊的复制方式?感谢。

5 个答案:

答案 0 :(得分:2)

使用y = list(x)创建新列表。否则,您只需获得对同一列表对象的新引用。

答案 1 :(得分:1)

您复制x

的引用

您可以尝试deepcopy享受一些乐趣

import copy

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

答案 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引用的数据,并使用yy = list(x)引用名称为y = x[:]的副本,然后排序y影响x,因为它们是真正不同的对象。或者,您可以使用非变异排序功能:x_sorted = sorted(x)

答案 4 :(得分:0)

您应该查看shallow copydeep copy是什么。这应该能够为您解决为什么您的复制方式无效。

参考:https://docs.python.org/2/library/copy.html

因此,当您说y = x时,这意味着您正在复制引用。但不完全创建具有不同引用的另一个列表。

y = copy.deepcopy(x)是深层副本,会为y.创建另一个引用,因此修改y不会更改x.中的任何值