Python 3中的zip()函数


问题内容

这个问题已经在这里有了答案

在zip对象列表上执行len会清除zip [重复] (2个答案)

5年前关闭。

我知道如何zip()在Python 3中使用该函数。我的问题是关于以下内容,我以某种方式感到很奇怪:

我定义了两个列表:

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在解释器中键入多少次,总能获得预期的结果,而且永远不会有一个空列表。


问题答案:

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

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