关于python:zip变量在首次使用后为空

zip variable empty after first use

Python 3.2.3,使用Idle和Python Shell

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

for x in z :
    print(x)

结果:
(1,5)
(2,6)
(3,7)

紧接着放置完全相同的循环代码以再次在for循环中显示z(在上面和下一部分之间不执行任何操作):

1
2
for x in z :
    print(x)

结果:
(空白,没有结果)

z仍然存在,因为

1
z

结果是

1
<zip object at 0xa8d48ec>

我什至可以重新分配要重新压缩的t,t2,但随后它只能工作一次,并且只能一次又一次地工作。

这是应该如何工作的吗? 在文档http://docs.python.org/3.2/library/functions.html#zip中没有提及此内容。


这就是在python 3.x中的工作方式。 在python2.x中,zip返回一个元组列表,但是对于python3.x,zip的行为类似于itertools.izip在python2.x中的行为。 要恢复python2.x的行为,只需从zip的输出构造一个列表:

1
z = list(zip(t,t2))

请注意,在python3.x中,许多内置函数现在返回迭代器而不是列表(mapzipfilter)


因为zip返回Python 3.x中的迭代器。 如果要重新使用它,请首先将其设置为list

1
z = list(zip(t, t2))


zip返回一个迭代器(在Python 3中)。 您只能在迭代器上迭代一次。 迭代器用完元素时不会消失,但是再次对其进行迭代将得到0个元素。 如果需要列表,请在其上调用list

1
z = list(zip(t, t2))