我从列表继承了一个UserList类,并实现了以下方法来删除标记为已删除的条目
def purge_deleted(self):
for element in list.__iter__(self):
if ele.mark_deleted < 1:
self.remove(element)
元素本身是一个复杂的实体,其方法会覆盖比较运算符
问题
答案 0 :(得分:2)
您将最终跳过元素,因为迭代器未更新以允许删除元素。
您可以反复遍历列表反向以避免该问题:
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__
挂钩(如果存在)。