我的问题是,当我创建一个列表时,'a'并使用
将其内容复制到另一个列表c中c=a[:]
现在当我调用一个函数以数字方式排序'a'时,我对它进行了排序,但是'c'的值也会被转换,即使我没有对'c'进行任何更改 请参考图片输入和输出! 提前致谢
答案 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。