22

蟒蛇 3.2

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 x in z:
    print(x)

z仍然存在<zip object at 0xa8d48ec>。我什至可以重新分配t,t2以再次压缩,但它只能工作一次,而且只能工作一次。

这是它应该如何工作的吗?文档中没有提到这一点。

4

3 回答 3

24

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

z = list(zip(t,t2))

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

于 2013-07-21T21:42:33.170 回答
11

因为zip在 Python 3.x 中返回一个迭代器。如果您想重复使用它,请先使用它list

z = list(zip(t, t2))
于 2013-07-21T21:42:43.247 回答
6

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

z = list(zip(t, t2))
于 2013-07-21T21:45:28.333 回答