0

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

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

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

问题

  1. 上述代码能否成功移除对象?
  2. python 如何在内部工作以从列表中删除元素?
  3. 当我们同时迭代和修改同一个列表时会不会产生问题?
4

1 回答 1

2

您最终将跳过元素,因为迭代器未更新以允许删​​除元素。

您可以反向遍历列表以避免该问题:

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

如果你不反转会发生什么,迭代器索引会增加,而不管是否有任何删除;如果您删除索引 1 处的项目,迭代器将移动到项目 2,即使在删除之前这是项目 3(跳过索引 2 处的项目)。

但是,当您反向删除项目时,索引会从 1 移动到 0,并且任何删除都发生在当前索引的“后面”。是否删除第 1 项不再重要。

reversed()迭代器将使用任何自定义__reversed__钩子(如果存在)。

于 2014-04-03T13:27:30.500 回答