Почему в Python itertools.cycle нужно создавать копию итерируемого?
Документация для Python itertools.cycle () дает реализацию псевдокода в виде:
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
Ниже говорится: «Обратите внимание, что этот элемент инструментария может потребовать значительного вспомогательного хранения (в зависимости от длины итерируемого)».
Я в основном шел по этому пути, за исключением того, что я сделал это, что не требует создания копии итерируемого:
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
печатает:
1
2
3
1
2
3
Да, я понимаю, что моя реализация не будет работать для str, но это может быть сделано для. Мне более любопытно, почему он создает еще одну копию. У меня есть чувство, что это связано со сборкой мусора, но я не очень хорошо изучен в этой области Python.
Спасибо!