Python 3中的zip()函数

dha*_*man 57 python

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

我定义了两个列表:

lis1 = [0, 1, 2, 3]
lis2 = [4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

我通过zip()以下方式使用这些:

1. test1 = zip( lis1, lis2)

2. test2 = list(zip(lis1, lis2))
Run Code Online (Sandbox Code Playgroud)

当我输入test1翻译时,我得到了这个:

"zip object at 0x1007a06c8"
Run Code Online (Sandbox Code Playgroud)

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

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

Bri*_*ien 80

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

 test2 = list(zip(lis1,lis2))
 zipped_list = test2[:]
 zipped_list_2 = list(test2)
Run Code Online (Sandbox Code Playgroud)

  • 这个伟大解释中最重要的词之一就是“曾经”这个词。即使测试压缩对象“len(list(zipped))”的长度也会耗尽它。 (2认同)

Ana*_*mar 22

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

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

但是一旦你做了 - list(test1)你已经用尽了迭代器.所以在那之后你随时list(test1)都会导致空列表.

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