1

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

我正在使用 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)]

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

4

2 回答 2

6

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

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

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

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

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

我希望这是有道理的(更容易在一张纸上勾勒出来:)

于 2012-08-22T21:28:13.317 回答
3

当你迭代一个迭代器时,元素会被消耗掉,所以每个数字只出现一次。

当您对同一个列表进行两次迭代时,会生成两个单独的列表迭代器,每个迭代器都会生成一次数字,因此每个数字总体上会出现两次。

你的第一个程序相当于做

print zip(iter(numList), iter(numList))
于 2012-08-22T21:27:11.393 回答