Por que o itertools.cycle do Python precisa criar uma cópia do iterável?
A documentação do itertools.cycle () do Python fornece uma implementação de pseudo-código como:
def cycle(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
Abaixo, afirma: "Note que este membro do kit de ferramentas pode requerer armazenamento auxiliar significativo (dependendo da duração do iterável)."
Eu basicamente estava seguindo esse caminho, exceto que fiz isso, o que não requer a criação de uma cópia do iterável:
def loop(iterable):
it = iterable.__iter__()
while True:
try:
yield it.next()
except StopIteration:
it = iterable.__iter__()
yield it.next()
x = {1, 2, 3}
hard_limit = 6
for i in loop(x):
if hard_limit <= 0:
break
print i
hard_limit -= 1
impressões:
1
2
3
1
2
3
Sim, percebo que minha implementação não funcionaria para str, mas poderia ser feita para. Estou mais curioso para saber por que cria outra cópia. Tenho a sensação de que isso tem a ver com a coleta de lixo, mas não estou bem estudado nessa área do Python.
Obrigado!