Рассматривать:
>>> 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не появляется, чтобы продвинуть итератор в этом случае?