Rozważać:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Tak więc, postęp iteratora jest, zgodnie z oczekiwaniami, obsługiwany przez mutację tego samego obiektu.
W takim przypadku spodziewałbym się:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
pomijać co drugi element: wywołanie to next
powinno przesuwać iterator jeden raz, a następnie niejawne wywołanie wykonane przez pętlę powinno przesuwać go po raz drugi - a wynik tego drugiego wywołania zostałby przypisany i
.
Tak nie jest. Pętla wypisuje wszystkie pozycje z listy, bez pomijania żadnych.
Moją pierwszą myślą było to, że może się to zdarzyć, ponieważ pętla wywołuje iter
to, co zostało przekazane, a to może dać niezależny iterator - tak nie jest, jak mamy iter(a) is a
.
Dlaczego więc next
w tym przypadku nie wydaje się, aby przyspieszyć iterator?
i
został już przydzielony.next(a)
oznacza, że następna iteracja2
jest przypisana doi
, następnie idziesza
dalej, drukujeszi
itd.StopIteration
excepetio nis podniesione, gdynext(a)
zostanie wywołane po usunięciu listy.Dzieje się tak, że
next(a)
zwraca następną wartość a, która jest drukowana do konsoli, ponieważ nie ma na nią wpływu.To, co możesz zrobić, to wpłynąć na zmienną o tej wartości:
źródło
Istniejące odpowiedzi są dla mnie trochę zagmatwane, ponieważ tylko pośrednio wskazują na zasadniczą tajemniczą rzecz w przykładzie kodu: zarówno * "print i", jak i "next (a)" powodują, że ich wyniki są drukowane.
Ponieważ drukują naprzemiennie elementy oryginalnej sekwencji i jest nieoczekiwane, że wypisuje się instrukcja „next (a)”, wygląda na to, że instrukcja „print i” wypisuje wszystkie wartości.
W tym świetle staje się bardziej jasne, że przypisanie wyniku „next (a)” do zmiennej blokuje drukowanie jej wyniku, tak że drukowane są tylko wartości alternatywne, które są wypisywane ze zmiennej pętli „i”. Podobnie, sprawienie, że instrukcja „print” emituje coś bardziej charakterystycznego, również ją ujednoznacznia.
(Jedna z istniejących odpowiedzi odrzuca inne, ponieważ ta odpowiedź ma przykładowy kod oceniany jako blok, więc interpreter nie zgłasza wartości pośrednich dla „next (a)”).
Ogólnie rzecz biorąc, czarujące w odpowiadaniu na pytania jest wyraźne mówienie o tym, co jest oczywiste, gdy już znasz odpowiedź. To może być nieuchwytne. Podobnie krytykujesz odpowiedzi, kiedy je zrozumiesz. To interesujące...
źródło
Coś jest nie tak z Twoim Pythonem / komputerem.
Działa zgodnie z oczekiwaniami.
Przetestowano w Pythonie 2.7 i Pythonie 3+. Działa poprawnie w obu
źródło
Dla tych, którzy nadal nie rozumieją.
Jak już powiedzieli inni,
next
zgodnie z oczekiwaniami zwiększa iterator o 1. Przypisanie zwracanej wartości do zmiennej nie zmienia magicznie jej zachowania.źródło
Zachowuje się tak, jak chcesz, jeśli zostanie wywołany jako funkcja:
źródło