列表得到更新,甚至没有修改它

时间:2017-11-12 06:47:04

标签: python python-2.7 python-3.x list sorting

我的问题是,当我创建一个列表时,'a'并使用

将其内容复制到另一个列表c中
c=a[:]

现在当我调用一个函数以数字方式排序'a'时,我对它进行了排序,但是'c'的值也会被转换,即使我没有对'c'进行任何更改 请参考图片输入和输出! 提前致谢

enter image description here

5 个答案:

答案 0 :(得分:2)

这是因为c = a[:]复制了顶级列表,但其中的项目是对相同子列表的引用。如果要避免此行为,可以执行深层复制:

from copy import deepcopy
c = deepcopy(a)

答案 1 :(得分:0)

奇怪,不应该改变:

>>> a=[1,4,5,7,22,41,4,-5,66,22,12]
>>> c=a[:]
>>> a.sort()
>>> a
[-5, 1, 4, 4, 5, 7, 12, 22, 22, 41, 66]
>>> c
[1, 4, 5, 7, 22, 41, 4, -5, 66, 22, 12]

您也可以尝试使用c = list(a)执行此操作。在这两种情况下,您都是按值而不是通过引用复制数组。

您应该知道,这两种方法对可变对象的集合有限制,因为内部对象保持其引用不变。因此,如果您需要完整副本,可以使用copy.deepcopy并像这样使用它:

>>> from copy import deepcopy
>>> a = [[1,2],[3],[4]]
>>> c = deepcopy(a)

答案 2 :(得分:0)

问题在于这一行:d[i][j] = int(d[i][j])。这会修改a,因为d尚未复制。这也修改了c,因为只复制了列表,而不是列表的元素,因此修改它们会修改两个列表。要解决此问题,您可以像其他答案所说的那样deepcopy,或者只使用c = [element[:] for element in a]

答案 3 :(得分:0)

有一个更全面的答案 How to clone or copy a list?

简单的答案是:如果列表中有对象 - 您需要深层复制列表,即复制对象......

答案 4 :(得分:0)

问题实际上是这一行:

d[i][j] = int(d[i][j])

这是修改您的输入(a)。

要解决此问题,您可以尝试修改函数以复制输入并直接修改它:

b = d[:]
...
b[i][j] = int(b[i][j])

然后你不需要重新分配b。