为啥插入方法会影响两个列表? [复制]

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 不影响顶部和底部插入?

语法错误,插入“AssignmentOperator 表达式”以完成表达式。为啥会这样? [复制]

python中列表的常用方法

为啥列表推导会影响外部变量的值? [复制]

将列表插入单元格 - 为啥 loc 实际上在这里工作?

为啥 Meteor 抱怨集合的插入方法已经定义?