【问题标题】: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)

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

问题

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

【问题讨论】:

标签: 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__ 挂钩(如果存在)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2013-09-12
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多