Ist es sicher, den Iterator dynamisch in Python zu wechseln?

Mit Python, muss ich Mitglieder in eine Liste dynamisch hinzufügen, wenn die Liste iterated über:

i = [1,2,3,4,5] for a in i: if a == 1: i.append(100) print a 

Ist es garantiert richtig zu funktionieren?

One Solution collect form web for “Ist es sicher, den Iterator dynamisch in Python zu wechseln?”

Sie ändern die Sequenz, nicht den Iterator. Die for Schleife ruft iter() auf das Objekt, das Sie umschleifen, Erstellen eines Loop-Iterators. Für ein Listenobjekt hält der erzeugte Listen-Iterator einen Verweis auf die ursprüngliche Liste und einen internen Index, und jedes Mal, wenn die for Schleife nach dem nächsten Element fragt (Aufrufe next() auf dem Iterator), wird das Element am aktuellen Index zurückgegeben Und der Index wird erhöht.

In diesem Fall ist es sicher, da das Loop-Iterator-Objekt gerne über die zusätzlichen Items geht. Solange du keine Gegenstände auf mich unbegrenzt hinzufügst, wird die Schleife abgeschlossen.

Wenn du Gegenstände von i entfernen würdest, würde der Loop-Iterator diese Änderungen nicht sehen und du wirst "überraschend" Ergebnisse erzielen:

 i = [1, 2, 3, 4, 5] for a in i: if a == 1: del i[0] print a 

Drucke:

 1 3 4 5 

Weil der Loop-Iterator i[1] bei der nächsten Iteration ergibt, was nun 3 , nicht 2 .

Ähnliche Probleme würden auftreten, wenn Sie Elemente vor dem aktuellen Iterationsindex einfügen möchten.

Du kannst den Iterator selbst erstellen und manuell experimentieren, um zu sehen, was passiert:

 >>> i = [1, 2, 3, 4, 5] >>> i_iter = iter(i) # index starts at 0 >>> next(i_iter) # now the index is 1 1 >>> del i[0] >>> i [2, 3, 4, 5] # item at index 1 is 3 >>> next(i_iter) # returns 3, next index is 2 3 >>> i.insert(0, 1) >>> i [1, 2, 3, 4, 5] # item at index 2 is 3 >>> next(i_iter) # returns 3, next index is 3 3 
  • Numpy: Anfänger nditer
  • Eine Funktion nur für bestimmte Bedingungen in Python laufen
  • Gibt es ein Pythonäquivalent des Bereichs (n) für mehrdimensionale Bereiche?
  • Konvertieren Sie den Durchschnitt der Python-Listenwerte in eine andere Liste
  • "TypeError: 'function' Objekt unterstützt keine Positionszuordnung"
  • Python3 typeError: 'function' Objekt ist nicht iterable
  • Effizient Iterating mit numpy
  • Python-Set-Iterationsreihenfolge variiert von Lauf zu Lauf
  • Überschneiden von zwei Wörterbüchern in Python
  • Gibt es einen Weg, um parallel zu haben - jede Schleife?
  • Führen Sie das Python-Skript nach dem anderen aus
  • Python ist die beste Programmiersprache der Welt.