Considerar:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Portanto, o avanço do iterador é, como esperado, tratado pela mutação desse mesmo objeto.
Sendo esse o caso, eu esperaria:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
para pular cada segundo elemento: a chamada para next
deve avançar o iterador uma vez; a chamada implícita feita pelo loop deve avançar uma segunda vez - e o resultado dessa segunda chamada seria atribuído a i
.
Não faz. O loop imprime todos os itens da lista, sem pular nenhum.
Meu primeiro pensamento foi que isso poderia acontecer porque o loop solicita iter
o que é passado e isso pode fornecer um iterador independente - esse não é o caso, como temos iter(a) is a
.
Então, por que next
não parece avançar o iterador nesse caso?