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)
我需要识别数据结构中满足条件的元素,将它们保存在某处,最后从原始结构中删除。因此,我使用循环而不是理解。
当尝试使用 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)