Python 3中的zip()函数

时间:2015-07-28 18:06:34

标签: python

我知道如何在Python 3中使用zip()函数。我的问题是关于以下我觉得非常特殊:

我定义了两个列表:

lis1 = [0, 1, 2, 3]
lis2 = [4, 5, 6, 7]

我在以下方面使用zip()

1. test1 = zip( lis1, lis2)

2. test2 = list(zip(lis1, lis2))

当我在翻译处输入test1时,我明白了:

"zip object at 0x1007a06c8"

所以,我在解释器中输入list(test1)并得到预期的结果,但是当我再次输入list(test1)时,我得到一个空列表。

我觉得奇怪的是,无论我在解释器中输入test2多少次,我总是得到预期的结果,而不是空列表。

2 个答案:

答案 0 :(得分:72)

与Python 2不同,Python 3中的zip函数返回迭代器。迭代器只能耗尽一次(通过诸如列表之类的东西)。这样做的目的是通过仅在需要时生成迭代器的元素来节省内存,而不是一次性将其全部放入内存中。如果要重用压缩对象,只需像在第二个示例中那样创建一个列表,然后通过类似

的方式复制列表。
 test2 = list(zip(lis1,lis2))
 zipped_list = test2[:]
 zipped_list_2 = list(test2)

答案 1 :(得分:20)

Python 3中的zip()函数返回一个迭代器。这就是为什么当你打印test1时得到 - <zip object at 0x1007a06c8>的原因。 From documentation -

  

创建一个聚合来自每个迭代的元素的迭代器。

但是一旦你做了 - list(test1) - 你已经用尽了迭代器。因此,在此之后,list(test1)只会导致空列表。

如果是test2,您已经创建了一次列表,test2是一个列表,因此它始终是该列表。