copying generatrors

Steven Bethard steven.bethard at gmail.com
Tue Jun 5 21:00:32 EDT 2007


Horace Enea wrote:
> My example wasn't very good. Here's another try:
> 
> def foo():
>    yield 1
>    yield 2
>    yield 3
> 
> f = foo()
> f.next()
> 1
> 
> g=copy(f)  # copy the generator after an iteration
> 
> f.next()
> 2
> f.next()
> 3
> 
> g.next()      
> 2
> 
> I want to copy the generator's state after one or more iterations.

You could use itertools.tee():

 >>> def foo():
...     yield 1
...     yield 2
...     yield 3
...
 >>> import itertools
 >>> f = foo()
 >>> f.next()
1
 >>> f, g = itertools.tee(f)
 >>> f.next()
2
 >>> f.next()
3
 >>> g.next()
2
 >>> g.next()
3

But note that if your iterators get really out of sync, you could have a 
lot of elements stored in memory.

STeVe



More information about the Python-list mailing list