我在Python中有一个deque,我正在迭代它。有时在我交互时,deque会发生变化,这会产生一个RuntimeError: deque mutated during iteration
。
如果这是一个Python列表而不是一个deque,我只需要遍历列表的一个副本(通过像my_list[:]
这样的切片,但是由于切片操作不能在deque上使用,我想知道处理这个问题的最Python的方法是什么?
我的解决方案是导入copy模块,然后遍历一个副本,比如for item in copy(my_deque):
,这很好,但是由于我到处搜索这个主题,我想我会在这里发帖询问?
你可以通过创建一个列表来“冻结”它。没有必要把它复制到一个新的地方。一个列表当然足够好了,因为你只需要它来迭代。
list(x)
从任何iterablex
创建一个列表,包括deque,在大多数情况下,这是最具python风格的方法。请记住,只有在同一线程(即在循环内)中修改deque时,此解决方案才有效。否则,请注意
list(my_deque)
不是原子的,并且也在deque上迭代。这意味着,如果另一个线程在deque运行时改变了它,那么您最终会出现相同的错误。如果您处于多线程环境中,请使用锁。虽然您可以在deque中创建一个列表,
for elem in list(deque)
,但如果它是一个常用函数,则这并不总是最佳的:它会有性能开销,特别是如果deque中有大量元素,并且您不断地将其更改为array
结构。无需创建列表的一种可能的替代方法是使用带一些布尔变量的
while
循环来控制条件。这提供了O(1)的时间复杂性。相关问题 更多 >
编程相关推荐