Skip to main content
 首页 » 编程设计

python之与两个可迭代对象相比,在两个列表上使用 zip()

2025年05月04日11hnrainll

作为免责声明,我对编程还比较陌生,所以请原谅我在写这个问题时所做的任何简单疏忽。

我正在使用 Python 2.7.3,在这样做的过程中,我注意到一些对我来说似乎不寻常的东西,并且无法通过 Google 搜索或 Python 文档找到令人满意的解释。我可以创建一个列表并使用 zip() 来创建元组列表,如下所示:

numList = range(4) 
print zip(numList, numList) 
 
[(0, 0), (1, 1), (2, 2), (3, 3)] 

但是当我在 numList 上使用 iter() 函数创建一个可迭代对象并以类似的方式在这个对象上使用 zip() 时,我得到了截然不同的结果:

numList = range(4) 
numList = iter(numList) 
print zip(numList, numList) 
 
[(0, 1), (2, 3)] 

如果有人能解释这两个过程之间的区别以及导致这种情况发生的幕后原因,我将不胜感激。

请您参考如下方法:

在第一种情况下,您为 zip 提供“两个”列表(实际上是同一个对象,即列表,但您提供了对它的两个引用),因此它从每个列表中提取相同的信息交替并“压缩”它。使用这些信息不会消耗它。

在第二种情况下,您创建一个迭代器,它将“即时”/按需生成从 0 到 3 的值。

您现在两次提供此迭代器以压缩(同样,对迭代器的相同引用),它从每个迭代器交替“拉出”数据。 (即它调用迭代器的 next() 函数)。

“第一个”迭代器提供第一个值 0,“第二个”迭代器(实际上只是对同一迭代器的引用)提供下一个值 1,并且以此类推,直到迭代器在 3 处耗尽。

所以要记住的主要事情是,在这两种情况下,您提供给 zip 的内容都是对相同 对象的两个相同引用。在第一种情况下,列表包含所有 已经交错/压缩的数据(访问/使用数据不会使其不可用)。在第二种情况下,数据是按需生成的,因此生成的序列是交错/压缩的,并且随着每个值的生成,它被消耗并且随后不再可用。

我希望这是有道理的(更容易在一张纸上画出草图 :)