在Python中迭代时将内容添加到双向队列中?

2024-09-27 07:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果这是一个Python列表而不是一个deque,我只需要遍历列表的一个副本(通过像my_list[:]这样的切片,但是由于切片操作不能在deque上使用,我想知道处理这个问题的最Python的方法是什么?

我的解决方案是导入copy模块,然后遍历一个副本,比如for item in copy(my_deque):,这很好,但是由于我到处搜索这个主题,我想我会在这里发帖询问?


Tags: 模块方法列表formy副本切片解决方案
2条回答

你可以通过创建一个列表来“冻结”它。没有必要把它复制到一个新的地方。一个列表当然足够好了,因为你只需要它来迭代。

for elem in list(my_deque):
    ...

list(x)从任何iterablex创建一个列表,包括deque,在大多数情况下,这是最具python风格的方法。


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

虽然您可以在deque中创建一个列表,for elem in list(deque),但如果它是一个常用函数,则这并不总是最佳的:它会有性能开销,特别是如果deque中有大量元素,并且您不断地将其更改为array结构。

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

相关问题 更多 >

    热门问题