Python zip对象只能使用一次。这是为什么?

时间:2017-10-30 08:31:53

标签: python iterator

我想学习zip类的功能。我写了这个非常简单的例子。

>>> names = ['name1','name2','name3']
>>> ages = ['age1','age2','age3']
>>> print(zip(names, ages))
<zip object at 0x03DB18F0>
>>> zipped = zip(names, ages)
for i in zipped:
    type(i)
    print(i)

并且输出(如预期的那样) -

<class 'tuple'>
('name1', 'age1')
<class 'tuple'>
('name2', 'age2')
<class 'tuple'>
('name3', 'age3')

然而,如果我写这篇文章,那么紧接在这行之后:

for i in zipped:
    print(i)

它编译但不打印任何内容!

要重新检查,我再次这样做了 -

>>> zipped = zip(names, ages)
>>> for i in zipped:
    print(i)
('name1', 'age1')
('name2', 'age2')
('name3', 'age3')

这次打印正确。但是在做解压缩时 -

>>> names2, ages2 = zip(*zipped)
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    names2, ages2 = zip(*zipped)
ValueError: not enough values to unpack (expected 2, got 0)

zipped变量似乎因某种原因变空了?

  

注意:如果需要,您可以更改问题的标题。我在windows(10)机器上使用python 3.6.1。

2 个答案:

答案 0 :(得分:6)

zip生成迭代器<zip object at 0x03DB18F0>),只能迭代一次。一旦你迭代了它,它已经筋疲力尽了。如果您想生成一个列表,可以根据需要随时迭代:

zipped = list(zip(names, ages))

答案 1 :(得分:3)

这是因为zip返回iterator个对象。它们不能被多次迭代,然后它们会变得耗尽

您可以使用list(zip(names, ages))从迭代器中创建列表

list使用迭代器对象创建一个列表,可以多次迭代。

您可以在此处详细了解zip功能。