2017-02-09 96 views
6

W pythonie próbowałem utworzyć kopię mojego iteratora za pomocą przypisania, ale utworzyłem kopię iteratora, która odwołuje się do oryginalnego iteratora. Na przykład:Jak utworzyć kopię iteratora Pythona?

my_list = [5, 4, 3,2] 
first_it = iter(my_list) 
second_it = first_it 
print next(first_it)  #it will print 5 
print next(second_it)  #it will print 4 
print next(first_it)  #it will print 3 

Jak widać w przykładzie first_it i second_it oba odnoszą się do tego samego obiektu iteratora. Czy jest możliwe utworzenie kopii obiektu iteratora, który nie ma odniesienia do oryginalnego obiektu?

Uwaga To pytanie jest o tym, jak tworzyć kopię obiektu iteracyjnej przez wartość. Więc nie wspominaj o takich rozwiązaniach jak for item in my_list:.
Z góry dziękuję

Odpowiedz

9

Użyj itertools.tee() function do tworzenia kopii; używają one bufora do udostępniania wyników między różnymi iteratorami:

from itertools import tee 

my_list = [5, 4, 3,2] 
first_it = iter(my_list) 
first_it, second_it = tee(first_it) 
print next(first_it) # prints 5 
print next(second_it) # prints 5 
print next(first_it) # prints 4 

Należy pamiętać, że nie należy już używać oryginalnego iteratora; używaj tylko koszulki.

Należy pamiętać, że bufor oznacza również, że mogą one ponieść znaczny koszt pamięci, jeśli jedna z kopii zostanie wyprzedana o wiele wcześniej! Z dokumentacji:

Ten itertool może wymagać znacznej pamięci dyskowej (w zależności od tego, ile danych tymczasowych musi być przechowywanych). Ogólnie, jeśli jeden iterator używa większości lub wszystkich danych przed uruchomieniem innego iteratora, szybciej jest użyć list() zamiast tee().

+0

Próbowałem z 'copy.copy()' i to działało. Może jest ukryty haczyk? –

+2

@ Jean-FrançoisFabre: To nie zadziała dla generatora. Spróbuj z generatorem, który na przykład używa 'while while True: yield random.random()'. –

+0

związane z: "nie można zaliczyć generatora" prawdopodobnie. –

Powiązane problemy