Python 列表可以在迭代期间发生变化,但双端队列不能。为什么?

Python list can be mutated during iteration but not deque. Why?

我需要识别数据结构中满足条件的元素,将它们保存在某处,最后从原始结构中删除。因此,我使用循环而不是理解。

当尝试使用 deque 重新实现该过程时,出现以下错误:RuntimeError:deque 在迭代期间发生突变。

from collections import deque

def foo1(x):
    pass

myDeque = deque([i for i in range(200)])  # i is in fact a complex, nested data structure

for index, e in enumerate(reversed(myDeque)):
    if e % 2 == 0: # also more complex logic
        foo1(e)
        # myDeque.pop(index) # TypeError: pop() takes no arguments (1 given)
        del myDeque[index] # RuntimeError: deque mutated during iteration
    

为什么我可以在迭代期间改变列表而不是双端队列?追加/插入在两者中都有效。

我目前正在使用从双端队列构建的临时列表。

from collections import deque

def foo1(x):
    pass

myDeque = deque([i for i in range(200)])

temp = list(myDeque)
for index, e in enumerate(reversed(temp)):
    if e % 2 == 0:
        foo1(e)
        temp.pop(index - 1)
myDeque = deque(temp)

解决方法:创建一个临时列表

from collections import deque

def foo1(x):
    pass

myDeque = deque([i for i in range(200)])

temp = list(myDeque)
for index, e in enumerate(reversed(temp)):
    if e % 2 == 0:
        foo1(e)
        temp.pop(index - 1)
myDeque = deque(temp)