2015-05-07 10 views
8

Ho un deque in Python che sto andando a finire. A volte la deque cambia mentre sto interagendo, producendo uno RuntimeError: deque mutated during iteration.Aggiungi a un deque che viene iterato in Python?

Se questa fosse una lista di Python invece di una deque, vorrei semplicemente scorrere su una copia dell'elenco (tramite una sezione come my_list[:], ma poiché le operazioni di slice non possono essere utilizzate su deques, mi chiedo quale sia la più pitone modo di gestire questo è?

La mia soluzione è di importare il modulo di copia e quindi iterare su una copia, come for item in copy(my_deque): che va bene, ma dal momento che ho cercato in alto e in basso per questo argomento ho pensato di postare qui per chiedere ?

+6

Perché stai modificando il 'deque' mentre lo iterating? Puoi mostrare un po 'di codice? – thefourtheye

+0

Cosa ti aspetti che succeda all'iterazione in cui sei nel mezzo rispetto a quali modifiche vengono apportate alla deque? – martineau

+0

Per quanto riguarda il motivo per cui lo sto alterando, questo deque è una coda utilizzata per contenere una serie di modalità attive in un'applicazione software per flipper e mentre le modalità sono aggiornate è possibile che altre modalità vengano avviate e aggiunte al deque. Sto bene con non chiamare nulla che è entrato durante l'iterazione, o chiamare tutto ciò che è stato rimosso durante l'iterazione. In realtà voglio ripetere il deque come era quando è iniziata l'iterazione, quindi la copia. –

risposta

9

È possibile "congelarlo" creando un elenco. Non è necessario copiarlo in un nuovo deque .Un elenco è sicuramente sufficiente, poiché è necessario solo iterarlo.

for elem in list(my_deque): 
    ... 

list(x) crea un elenco da qualsiasi iterabile x, tra cui deque, e nella maggior parte dei casi è il modo più divinatorio di farlo.


Bare in mente questa soluzione è valido solo se la coda doppia viene modificata nello stesso thread (cioè all'interno del ciclo). Altrimenti, tieni presente che lo list(my_deque) non è atomico e sta anche iterando sulla deque. Ciò significa che se un altro thread modifica la deque mentre è in esecuzione, si ottiene lo stesso errore. Se ti trovi in ​​un ambiente con multithreading, utilizza un lucchetto.