Рассматривать:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Таким образом, продвижение итератора, как и ожидалось, обрабатывается путем изменения этого же объекта.
В таком случае я бы ожидал:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
пропустить каждый второй элемент: вызов next
должен продвинуть итератор один раз, затем неявный вызов, сделанный циклом, должен продвинуть его во второй раз - и результат этого второго вызова будет присвоен i
.
Это не так. Цикл печатает все элементы в списке, не пропуская ни одного.
Моей первой мыслью было, что это может произойти, потому что цикл вызывает iter
то, что он передается, и это может дать независимый итератор - это не тот случай, как у нас iter(a) is a
.
Итак, почему next
не появляется, чтобы продвинуть итератор в этом случае?