Поміркуйте:
>>> 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
не з’являється просування ітератора в цьому випадку?