On 08/04/12 14:20, Franck Ditter wrote: > Two similar iterable objects but with a different behavior : > > $$$ i = range(2,5) > $$$ for x in i : print(x,end=' ') > > 2 3 4 > $$$ for x in i : print(x,end=' ') # i is not exhausted > > 2 3 4 > > --------- Compare with : > > $$$ i = filter(lambda c : c.isdigit(), 'a1b2c3') > $$$ for x in i : print(x,end=' ') > > 1 2 3 > $$$ for x in i : print(x,end=' ') # i is exhausted > > $$$ > > IMHO, this should not happen in Py3k. > What is the rationale of this (bad ?) design, which forces the programmer > to memorize which one is exhaustable and which one is not ?...
I can't speak to the rationale, but it seems that a range() object has some extra features that a normal iter doesn't: >>> i = iter(range(2,5)) >>> for x in i: print (x, end=' ') ... 2 3 4 >>> for x in i: print (x, end=' ') ... (your 2nd behavior, and what I'd expect). So my guess would be that the "for {var} in {thing}" triggers a re-calling of range.__iter__ since it's not an iterator to begin with. -tkc -- http://mail.python.org/mailman/listinfo/python-list