【问题标题】:safe usage of remove method in python在python中安全使用remove方法
【发布时间】:2014-05-15 08:51:24
【问题描述】:
我从列表中继承了一个 UserList 类并实现了以下方法来删除标记为已删除的条目
def purge_deleted(self):
for element in list.__iter__(self):
if ele.mark_deleted < 1:
self.remove(element)
元素本身是一个复杂的实体,具有覆盖比较运算符的方法
问题
- 上述代码能否成功移除对象?
- python 如何在内部工作以删除
列表中的元素?
- 当我们同时
迭代和修改同一个列表?
【问题讨论】:
标签:
python
python-internals
【解决方案1】:
您最终会跳过元素,因为迭代器未更新以允许删除元素。
您可以反向遍历列表以避免该问题:
def purge_deleted(self):
for element in reversed(self):
if ele.mark_deleted < 1:
self.remove(element)
如果你不反转会发生什么,迭代器索引会增加而不管任何删除;如果您删除索引 1 处的项目,迭代器将继续移动到项目 2,即使在删除之前这是项目 3(跳过先前在索引 2 处的项目)。
当您删除 reverse 中的项目时,索引会从 1 移动到 0,并且所有删除都发生在当前索引的“后面”。第 1 项是否被删除已经无关紧要了。
reversed() iterator 将使用任何自定义的 __reversed__ 挂钩(如果存在)。