2015-05-07 144 views
8

我有一個Python的deque,我正在迭代。有時候,我在進行交易時發生變化,產生RuntimeError: deque mutated during iteration添加到在Python中迭代的deque?

如果這是一個Python列表而不是雙端隊列,我只需迭代列表的一個副本(通過像my_list[:]這樣的片,但由於片操作不能在deques上使用,我不知道什麼是最pythonic處理這種方式是?

我的解決方案是導入複製模塊,然後遍歷副本,如for item in copy(my_deque):這很好,但由於我搜索這個主題的高低,我想我會在這裏發帖問?

+6

爲什麼在迭代時改變'deque'?你能顯示一些代碼嗎? – thefourtheye

+0

對於正在對deque進行修改的迭代,你期望發生什麼? – martineau

+0

至於我爲什麼要改變它,這個雙排隊是用來在彈球機軟件應用程序中保存一堆活動模式的隊列,並且當模式被服務時,其他模式可以被啓動並被添加到雙端隊列。 我很好,沒有調用迭代過程中出現的任何東西,或者調用迭代過程中刪除的任何東西。真的,我想迭代迭代開始時迭代,因此複製。 –

回答

9

你可以通過創建一個列表來「凍結」它,沒有必要將它複製到一個新的雙端隊列列表當然是足夠好的,因爲你只需要迭代它就可以了

for elem in list(my_deque): 
    ... 

list(x)創建一個從任何可迭代x,包括雙端隊列列表,並且在大多數情況下是最Python的方式這樣做。


想到這個解決方案只有在deque在同一線程(即循環內部)被修改時纔有效。否則,請注意list(my_deque)不是原子的,並且正在迭代deque。這意味着如果另一個線程在運行時更改了雙端隊列,則最終會出現相同的錯誤。如果您處於多線程環境中,請使用鎖定。