Skip to main content
 首页 » 编程设计

python之如何在循环列表本身时删除列表元素而不复制它

2025年05月04日9pengyingh

我在这个 Python for 语句上浪费了一点时间:

class MyListContainer: 
    def __init__(self): 
        self.list = [] 
 
    def purge(self): 
        for object in self.list: 
            if (object.my_cond()): 
                self.list.remove(object) 
        return self.list 
 
container = MyListContainer() 
 
# now suppose both obj.my_cond() return True 
obj1 = MyCustomObject(par) 
obj2 = MyCustomObject(other_par) 
 
container.list = [obj1, obj2] 
 
# returning not an empty list but [obj2] 
container.purge() 

它没有像我预期的那样工作,因为当“清除”中的循环删除列表中的第一个对象时,第二个对象被移到列表的开头并且循环结束。

我解决了在 for 循环之前复制 self.list 的问题:

... 
local_list = self.list[:] 
for object in local_list: 
... 

我想 for 语句停止工作是因为我正在更改原始列表的长度。有人可以澄清这一点吗?

有没有更“优雅”的方法来解决这个问题?如果我在列表中有多个元素,每次都复制它似乎不是一个好主意。

也许 filter() 函数是正确的,但我希望有其他方法(如果有的话)。

我是新手。


总结您的有用答案:

  • 永远不要编辑你正在循环的列表
  • 复制列表或使用列表理解
  • 复制列表不会浪费你的内存,在这种情况下谁会介意它

请您参考如下方法:

不要尝试。只是不要。制作副本或生成新列表。