Python 3中的 zip()函数

我知道如何在 Python3中使用 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,我总是得到预期的结果,而且从来不会得到一个空列表。

136245 次浏览

Python3中的 zip()函数返回一个迭代器。这就是为什么当你打印 test1时,你会得到 -<zip object at 0x1007a06c8>来自文档-

创建一个迭代器,用于聚合每个迭代器中的元素。

但是一旦你这样做了-list(test1)-你已经耗尽了迭代器。所以在那之后,任何时候你做 list(test1)只会导致空列表。

对于 test2,您已经创建了一次列表,test2是一个列表,因此它将始终是那个列表。

与 Python2不同,Python3中的 zip函数返回一个 迭代器。迭代器只能耗尽一次(通过列出它们之类的东西)。这样做的目的是节省内存,只在需要时生成迭代器的元素,而不是一次性将所有元素放入内存中。如果希望重用压缩对象,只需像在第二个示例中那样创建一个列表,然后通过类似下面的方法复制该列表

 test2 = list(zip(lis1,lis2))
zipped_list = test2[:]
zipped_list_2 = list(test2)