为啥插入方法会影响两个列表? [复制]
Posted
技术标签:
【中文标题】为啥插入方法会影响两个列表? [复制]【英文标题】:Why the insert method affects both lists? [duplicate]为什么插入方法会影响两个列表? [复制] 【发布时间】:2021-08-25 21:52:01 【问题描述】:我制作了一份清单,然后复制了一份。我尝试在每个元素的元素中插入不同的值。
list1 = [
[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]
]
list2 = list1.copy()
for i in range(8):
list1[i].insert(0, 0)
list2[i].insert(0, 1)
但结果是两个列表都受到两个插入的影响。我知道它们是不同的对象,因为我使用 id(list1)
和 id(list2)
打印了它们的 ID,所以我不明白为什么会这样。
任何帮助都会很有用。
提前谢谢你。
【问题讨论】:
因为两个列表包含相同的列表。您从未复制列表inside 列表。你想要list2 = [sublist.copy() for sublist in list1]
@juanpa.arrivillaga deepcopy
呢?
@PeterWood 我个人不是粉丝,因为它太慢了,但它是一个非常有效的解决方案。虽然存在细微差别,x = []; y = [x, x]; z = copy.deepcopy(y); z[0].append('foo')
仍会导致 [['foo'], ['foo']]
,而上述不会...
@juanpa.arrivillaga 我必须承认我不相信 deepcopy
用于一般用途,但在这种情况下,结果会是什么很清楚。
@PeterWood 查看我的编辑以了解细微差别。再说一次,这可能很愚蠢,但我只是不喜欢它做了多少额外的工作。
【参考方案1】:
使用deepcopy
。
from copy import deepcopy
list1 = [
[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]
]
list2 = deepcopy(list1)
for i in range(8):
list1[i].insert(0, 0)
list2[i].insert(0, 1)
输出
list1: [[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 1, 1], [0, 1, 0, 0], [0, 1, 0, 1], [0, 1, 1, 0], [0, 1, 1, 1]]
list2: [[1, 0, 0, 0], [1, 0, 0, 1], [1, 0, 1, 0], [1, 0, 1, 1], [1, 1, 0, 0], [1, 1, 0, 1], [1, 1, 1, 0], [1, 1, 1, 1]]
【讨论】:
以上是关于为啥插入方法会影响两个列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 insetForSectionAtIndex 不影响顶部和底部插入?