Erwägen:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Das Vorrücken des Iterators erfolgt also erwartungsgemäß durch Mutieren desselben Objekts.
In diesem Fall würde ich erwarten:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
Um jedes zweite Element zu überspringen: Der Aufruf von next
sollte den Iterator einmal vorrücken, dann sollte der implizite Aufruf der Schleife ihn ein zweites Mal vorrücken - und das Ergebnis dieses zweiten Aufrufs würde zugewiesen i
.
Das tut es nicht. Die Schleife druckt alle Elemente in der Liste, ohne sie zu überspringen.
Mein erster Gedanke war, dass dies passieren könnte, weil die Schleife aufruft, iter
was übergeben wird, und dies könnte einen unabhängigen Iterator ergeben - dies ist nicht der Fall, wie wir es getan haben iter(a) is a
.
Warum scheint next
der Iterator in diesem Fall nicht voranzukommen?
i
wurde bereits vergeben.next(a)
bedeutet, dass die nächste Iteration2
zugewiesen wirdi
, dann gehen Siea
wieder weiter, druckeni
usw.StopIteration
excepetio n wird ausgelöst, wennnext(a)
es aufgerufen wird, nachdem die Liste exaustiert wurde.Was passiert, ist, dass
next(a)
der nächste Wert von a zurückgegeben wird, der auf der Konsole gedruckt wird, weil er nicht betroffen ist.Sie können eine Variable mit diesem Wert beeinflussen:
quelle
Ich finde die vorhandenen Antworten etwas verwirrend, weil sie nur indirekt auf das Wesentliche im Codebeispiel hinweisen: Sowohl * das "print i" als auch das "next (a)" bewirken, dass ihre Ergebnisse gedruckt werden.
Da sie alternierende Elemente der ursprünglichen Sequenz drucken und es unerwartet ist, dass die Anweisung "next (a)" gedruckt wird, sieht es so aus, als ob die Anweisung "print i" alle Werte druckt.
In diesem Licht wird klarer, dass das Zuweisen des Ergebnisses von "next (a)" zu einer Variablen das Drucken ihres Ergebnisses verhindert, so dass nur die alternativen Werte gedruckt werden, die die "i" -Schleifenvariable druckt. In ähnlicher Weise wird es auch deutlich, wenn die "print" -Anweisung etwas Besonderes hervorruft.
(Eine der vorhandenen Antworten widerlegt die anderen, da bei dieser Antwort der Beispielcode als Block ausgewertet wird, sodass der Interpreter die Zwischenwerte für "next (a)" nicht meldet.)
Das Verführerische bei der Beantwortung von Fragen ist im Allgemeinen, explizit zu sagen, was offensichtlich ist, sobald Sie die Antwort kennen. Es kann schwer fassbar sein. Ebenso kritisieren Sie Antworten, sobald Sie sie verstanden haben. Es ist interessant...
quelle
Mit Ihrem Python / Computer stimmt etwas nicht.
Funktioniert wie erwartet.
Getestet in Python 2.7 und in Python 3+. Funktioniert in beiden richtig
quelle
Für diejenigen, die immer noch nicht verstehen.
Wie andere bereits gesagt haben,
next
erhöht sich der Iterator erwartungsgemäß um 1. Das Zuweisen des zurückgegebenen Werts zu einer Variablen ändert das Verhalten nicht auf magische Weise.quelle
Es verhält sich wie gewünscht, wenn es als Funktion aufgerufen wird:
quelle