【问题标题】: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 查看我的编辑以了解细微差别。再说一次,这可能很愚蠢,但我只是不喜欢它做了多少额外的工作。

标签: python list insert


【解决方案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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多