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 
  • Multiple für Loop-Iteratoren zum Auspacken in Python
  • Ist es schneller, eine kleine Liste innerhalb einer any () - Anweisung zu iterieren?
  • Python-Pandas zählen Anzahl der Regex-Matches in einer Zeichenfolge
  • Warum haben Python-Saiten keine __iter__ Funktion?
  • Fangen Fehler im Generator und weiter danach
  • Beschleunige Iteration über Numpy Arrays / OpenCV cv2 Bild
  • Python Wörterbuch Verständnis Iterator
  • Iterating über Partitionen in Python
  • Paarweise Durchquerung einer Liste oder eines Tupels
  • Effizient Iterating mit numpy
  • Spark Iteration Zeit zunehmend exponentiell bei der Verwendung beitreten
  • Python ist die beste Programmiersprache der Welt.