【问题标题】:Why does removing items from list while iterating over it skip every other item [duplicate]为什么在迭代列表时从列表中删除项目会跳过所有其他项目[重复]
【发布时间】:2020-03-17 08:50:11
【问题描述】:

在遍历列表并删除每个项目时,为什么其他所有项目都被跳过而不被删除? (我意识到这样做可能是不好的做法,我只是想了解发生了什么)

lst=[0,1,2,3,4,5,6,7,8,9]
for item in lst:
    lst.remove(item)
print(lst)

预期输出:[] 实际输出:[1, 3, 5, 7, 9]

【问题讨论】:

标签: python python-3.x list foreach


【解决方案1】:

这里发生的情况如下:

您从以下列表开始: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

然后,在 for 循环的第一次迭代中,您获得列表的第一项 0,并将其从列表中删除。更新后的列表现在看起来像: [1, 2, 3, 4, 5, 6, 7, 8, 9]

然后,在循环的第二次迭代中,您将获得更新列表中的第二项。在这里,第二项不再是1,而是2(因为您查看了更新的列表),因此您从列表中删除了2。更新后的列表现在看起来像: [1, 3, 4, 5, 6, 7, 8, 9]

它会继续......直到你得到: [1, 3, 5, 7, 9]

【讨论】:

    【解决方案2】:

    要获得预期的输出,您需要遍历列表的shallow copy,同时仍然从原始列表中删除项目,如下所示

    lst=[0,1,2,3,4,5,6,7,8,9]
    for item in lst[:]: # note the `[:]`
        lst.remove(item)
    print(lst)
    # returns []
    

    否则,您将遍历同时更改的列表,参见@Tibbles 的解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2020-05-27
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2021-03-12
      相关资源
      最近更新 更多