关于使用 for 循环从列表中删除项目

About removing an item from a list with a for loop

假设我们尝试使用以下代码删除列表中的所有元素:

a = [1, 2, 3, 4]
for i in a:
    a.remove(i)

当然这不是“允许的”并且会失败。另一方面,我们可以这样做:

a = [1, 2, 3, 4]
for i in list(a):
    a.remove(i)

而这个 工作。所以,我有两个问题:

  1. 为什么第二种方法有效?
  2. 第二种方法可以接受并应该使用吗?

提前致谢!

您可以通过在代码中添加打印来了解该过程:

a = [1, 2, 3, 4]
for i in a:
    print('Deleting: {}'.format(i))
    a.remove(i)
print(a)

在您的第一个示例中,循环从删除 1 开始,然后移至列表中的第二个元素。但是,由于您删除了 1,循环中的下一个元素是列表中的第二个元素,现在是 32 现在是第一个)- 所以循环删除 3。然后它想删除第三个元素,但是没有这个元素了。

在第二个示例中,list(a)实际上创建了一个列表的新实例(具有与a相同的元素),所以您实际上做的是迭代这个新的元素列出,并删除原a中对应的元素。由于两个列表包含相同的元素 - a 中的所有元素都将被删除。

关于你的第二个问题是什么被接受 - 这完全取决于你想要实现什么。

第二个代码有效,因为使用 list(a) 创建了一个新列表。然后您遍历新列表并从原始列表中删除项目。

第二个代码是可以接受的,因为您没有遍历正在修改的同一个列表。