21
votes

Python 3.2

t = (1, 2, 3)
t2 = (5, 6, 7)
z = zip(t, t2)

for x in z:
    print(x)

Result:

(1, 5)
(2, 6)
(3, 7)

Putting in EXACTLY the same loop immediately after, nothing is printed:

for x in z:
    print(x)

z still exists as <zip object at 0xa8d48ec>. I can even reassign the t, t2 to be zipped again, but then it only works once and only once, again.

Is this how its supposed to work? There's no mention in the docs about this.

3

3 Answers

24
votes

That's how it works in python 3.x. In python2.x, zip returned a list of tuples, but for python3.x, zip behaves like itertools.izip behaved in python2.x. To regain the python2.x behavior, just construct a list from zip's output:

z = list(zip(t,t2))

Note that in python3.x, a lot of the builtin functions now return iterators rather than lists (map, zip, filter)

11
votes

Because zip returns an iterator in Python 3.x. If you want to re-use it, then make it a list first:

z = list(zip(t, t2))
5
votes

zip returns an iterator (in Python 3). You can only iterate over an iterator once. The iterator doesn't vanish when it's out of elements, but iterating over it again gives 0 elements. If you want a list, call list on it:

z = list(zip(t, t2))