添加到 Python 中迭代的双端队列?

Add to a deque being iterated in Python?

我正在迭代 Python 中的双端队列。有时双端队列会在我进行交互时发生变化,这会产生 RuntimeError: deque mutated during iteration.

如果这是一个 Python 列表而不是双端队列,我将只遍历列表的一个副本(通过像 my_list[:] 这样的切片,但由于不能使用切片操作在 deques 上,我想知道最 Pythonic 的处理方式是什么?

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

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

for elem in list(my_deque):
    ...

list(x) 从任何可迭代对象 x 创建一个列表,包括双端队列,在大多数情况下,这是最符合 pythonic 的方式。


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

虽然您可以从双端队列中创建一个列表,for elem in list(deque),但如果它是一个经常使用的函数,这并不总是最佳的:它会带来性能成本,尤其是。如果双端队列中有大量元素,并且您不断将其更改为 array 结构。

无需创建列表的可能替代方法是使用 while 循环和一些布尔变量来控制条件。这提供了 O(1) 的时间复杂度。