添加到在Python中迭代的deque?

时间:2015-05-07 16:49:10

标签: python deque

我在Python中有一个deque,我正在迭代。有时deque会在我正在进行交互时发生变化,从而产生RuntimeError: deque mutated during iteration

如果这是一个Python列表而不是双端队列,我只是迭代一个列表的副本(通过像my_list[:]这样的片段,但由于切片操作不能用于deques,我想知道是什么处理这个问题的最pythonic方式是?

我的解决方案是导入复制模块,然后迭代副本,如for item in copy(my_deque):,这很好,但由于我搜索了这个主题的高低,我想我会在这里发帖询问?

1 个答案:

答案 0 :(得分:13)

你可以"冻结"它通过创建一个列表。没有必要将它复制到新的双端队列。列表当然足够好,因为你只需要它来进行迭代。

for elem in list(my_deque):
    ...

list(x)从任何可迭代的x创建一个列表,包括deque,在大多数情况下是最pythonic的方式。

请记住,只有在相同线程(即循环内)中修改了双端队列时,此解决方案才有效。否则,请注意list(my_deque)不是原子的,并且也在遍历deque。这意味着如果另一个线程在运行时改变了双端队列,则最终会出现相同的错误。如果您处于多线程环境中,请使用锁定。