Dans python j'ai essayé de créer une copie de mon itérateur en utilisant l'affectation mais il crée une copie de l'itérateur qui fait référence à l'itérateur original lui-même. Par exemple:
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
Comme vous le voyez dans l'exemple, first_it et second_it font référence au même objet itérateur. Est-il possible de créer une copie de l'objet itérateur qui ne fait pas référence à l'objet d'origine?
Note Cette question concerne la création d'une copie d'un objet itérateur par valeur. Alors ne mentionnez pas for item in my_list:
comme des solutions.
Merci d'avance
Utilisez la fonction itertools.tee()
pour produire des copies; ceux-ci utilisent un tampon pour partager les résultats entre différents itérateurs:
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
Notez que vous ne devez plus utiliser l'itérateur d'origine; utilisez uniquement les tees.
Notez que le tampon signifie également que ceux-ci peuvent entraîner un coût de mémoire important si vous avancez l'une des copies bien avant les autres! De la documentation:
Cet outil peut nécessiter un stockage auxiliaire important (selon la quantité de données temporaires à stocker). En général, si un itérateur utilise la plupart ou la totalité des données avant le démarrage d'un autre itérateur, il est plus rapide d'utiliser
list()
au lieu detee()
.