首次使用后,zip变量为空

jas*_*son 15 python python-3.x

Python 3.2.3,使用Idle,Python shell

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

for x in z :
    print(x)
Run Code Online (Sandbox Code Playgroud)

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

完全使用相同的循环代码再次在for循环中显示z(在上一部分和下一部分之间不做任何事情):

for x in z :
    print(x)
Run Code Online (Sandbox Code Playgroud)

结果:(空白,无结果)

z仍然存在,如

z
Run Code Online (Sandbox Code Playgroud)

结果是

<zip object at 0xa8d48ec>
Run Code Online (Sandbox Code Playgroud)

我甚至可以重新分配t,t2再次拉链,但是它只能再次使用一次而且只能工作一次.

它应该如何工作?在http://docs.python.org/3.2/library/functions.html#zip的文档中没有提到这一点.

mgi*_*son 16

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

z = list(zip(t,t2))
Run Code Online (Sandbox Code Playgroud)

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

  • @NeilWalker——也许不是,但是python的迭代器启用的延迟迭代有很多非常好的好处(考虑任何类型的不可查找的流数据)。与世界的“一切都是列表”的观点相比,您可以用很少的系统开销进行大量处理。 (2认同)

Jon*_*nts 10

因为zip在Python 3.x中返回一个迭代器.如果你想重新使用它,那么list先把它做成:

z = list(zip(t, t2))
Run Code Online (Sandbox Code Playgroud)


use*_*ica 5

zip返回一个迭代器(在Python 3中).您只能迭代一次迭代器.当迭代器超出元素时,迭代器不会消失,但迭代迭代器会产生0个元素.如果您想要一个列表,请致电list:

z = list(zip(t, t2))
Run Code Online (Sandbox Code Playgroud)