我在Python中有一个缺陷,我正在迭代它。有时,当我交互时,这种缺陷会发生变化,这会产生一个RuntimeError: deque mutated during iteration
。
如果这是Python列表而不是deque,我只会迭代列表的一个副本(通过像my_list[:]
这样的片),但是由于片操作不能在deques上使用,我想知道处理这个问题最重要的是什么?
我的解决方案是导入复制模块,然后迭代一个副本,比如for item in copy(my_deque):
,这很好,但是由于我搜索了这个主题,所以我想在这里发帖询问?
发布于 2015-05-07 17:01:57
您可以通过创建列表来“冻结”它。没有必要把它复制到一个新的设备上。列表当然足够好,因为您只需要它来迭代。
for elem in list(my_deque):
...
list(x)
从任何可迭代的x
(包括deque )中创建一个列表,在大多数情况下,这是最重要的仿生方法。
请记住,只有在同一个线程(即循环内部)中修改deque时,此解决方案才有效。否则,请注意,list(my_deque)
不是原子的,而且还在对deque进行迭代。这意味着,如果另一个线程在运行时更改deque,则会导致相同的错误。如果您处于多线程环境中,请使用锁。
发布于 2018-09-15 05:24:47
虽然您可以从deque ( for elem in list(deque)
)中创建一个列表,但如果它是一个经常使用的函数,这并不总是最优的:特别是它的性能成本。如果deque中有大量元素,并且您正在不断地将其更改为array
结构。
一种不需要创建列表的可能选择是使用带有布尔变量的while
循环来控制条件。这提供了O(1)的时间复杂度。
https://stackoverflow.com/questions/30107212
复制相似问题