打印解压缩的列表对象 returns 空列表

Printing an unzipped list object returns empty list

在下面的代码中,我试图解压缩一个 zip 对象。

x = [1, 2, 3]; y = ['a', 'b', 'c']

z = zip(x, y)
#print(list(z))                #2nd print statement returns [] if this line is uncommented

unzip = zip(*z)
print(list(unzip))             #returns [(1, 2, 3), ('a', 'b', 'c')]

如果我保持代码不变,它可以正常工作。但是 在取消注释第一个打印语句时,第二个打印语句 returns 一个 空列表 而不是返回解压缩的列表对象。为什么?

zip returns 一个迭代器。在 Python 中,迭代器可以 消耗 ,这意味着一旦你迭代了它们,就不能再重复了。当您执行 list(z) 时,您使用了迭代器 z,因此在 zip(*z) 中将其解包给您一个空迭代器。

使用迭代器背后的想法是它们使用很少 space(复杂度为 O(1)),因此您不能多次迭代它们,因为这意味着您必须存储所有值,导致 O(n) 的复杂性。当你多次迭代一个集合时,你实际上每次都在生成一个新的迭代器。

发生这种情况是因为 zip 函数 returns 一个迭代器,而不是一个新列表。也就是说,只能访问一次。
当你第一次打印它时,解释器循环遍历这个函数的结果。
因此,您无法第二次访问 zip 函数的结果。