我在这个 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() 函数是正确的,但我希望有其他方法(如果有的话)。
我是新手。
总结您的有用答案:
- 永远不要编辑你正在循环的列表
- 复制列表或使用列表理解
- 复制列表不会浪费你的内存,在这种情况下谁会介意它
请您参考如下方法:
不要尝试。只是不要。制作副本或生成新列表。
