在python中安全使用remove方法

时间:2014-04-03 13:22:52

标签: python python-internals

我从列表继承了一个UserList类,并实现了以下方法来删除标记为已删除的条目

def purge_deleted(self):
    for element in list.__iter__(self):
        if ele.mark_deleted < 1:
            self.remove(element)

元素本身是一个复杂的实体,其方法会覆盖比较运算符

问题

  1. 以上代码是否会成功删除对象?
  2. python如何在内部工作以删除 列表中的元素?
  3. 我们同时不会产生问题 迭代并修改相同的列表?

1 个答案:

答案 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__挂钩(如果存在)。