关于使用 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)
而这个 会 工作。所以,我有两个问题:
- 为什么第二种方法有效?
- 第二种方法可以接受并应该使用吗?
提前致谢!
您可以通过在代码中添加打印来了解该过程:
a = [1, 2, 3, 4]
for i in a:
print('Deleting: {}'.format(i))
a.remove(i)
print(a)
在您的第一个示例中,循环从删除 1
开始,然后移至列表中的第二个元素。但是,由于您删除了 1
,循环中的下一个元素是列表中的第二个元素,现在是 3
(2
现在是第一个)- 所以循环删除 3
。然后它想删除第三个元素,但是没有这个元素了。
在第二个示例中,list(a)
实际上创建了一个列表的新实例(具有与a
相同的元素),所以您实际上做的是迭代这个新的元素列出,并删除原a
中对应的元素。由于两个列表包含相同的元素 - a
中的所有元素都将被删除。
关于你的第二个问题是什么被接受 - 这完全取决于你想要实现什么。
第二个代码有效,因为使用 list(a)
创建了一个新列表。然后您遍历新列表并从原始列表中删除项目。
第二个代码是可以接受的,因为您没有遍历正在修改的同一个列表。
假设我们尝试使用以下代码删除列表中的所有元素:
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)
而这个 会 工作。所以,我有两个问题:
- 为什么第二种方法有效?
- 第二种方法可以接受并应该使用吗?
提前致谢!
您可以通过在代码中添加打印来了解该过程:
a = [1, 2, 3, 4]
for i in a:
print('Deleting: {}'.format(i))
a.remove(i)
print(a)
在您的第一个示例中,循环从删除 1
开始,然后移至列表中的第二个元素。但是,由于您删除了 1
,循环中的下一个元素是列表中的第二个元素,现在是 3
(2
现在是第一个)- 所以循环删除 3
。然后它想删除第三个元素,但是没有这个元素了。
在第二个示例中,list(a)
实际上创建了一个列表的新实例(具有与a
相同的元素),所以您实际上做的是迭代这个新的元素列出,并删除原a
中对应的元素。由于两个列表包含相同的元素 - a
中的所有元素都将被删除。
关于你的第二个问题是什么被接受 - 这完全取决于你想要实现什么。
第二个代码有效,因为使用 list(a)
创建了一个新列表。然后您遍历新列表并从原始列表中删除项目。
第二个代码是可以接受的,因为您没有遍历正在修改的同一个列表。