在xrange对象上调用多个迭代器

时间:2013-12-18 23:19:40

标签: python iterator generator

为什么

zip(*[xrange(5)]*2)

[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)],但

zip(*[iter(xrange(5))]*2)

[(0, 1), (2, 3)]

我总是认为生成器是迭代器,因此生成器上的iter是无操作的。

例如,

list(iter(xrange(5)))
[0, 1, 2, 3, 4]

相同
list(xrange(5))
[0, 1, 2, 3, 4]

(Python 3也是如此,但list(zip(range也是如此。)

1 个答案:

答案 0 :(得分:8)

iterable iterator 之间存在差异。您可以使用iter(x)为任何给定的可迭代x构建迭代器。迭代器封装迭代的状态,而可迭代的东西可以从中创建新的迭代器。

xrange()是一个可迭代的,但不是迭代器。您可以为单个xrange()对象创建多个迭代器,并且每个对象都有自己的位置。

zip()函数在每个参数上隐式调用iter()。对于zip(*[xrange(5)]*2),这将为相同的xrange()对象创建两个迭代器,每个对象都有自己的迭代状态。对于zip(*[iter(xrange(5))]*2),您已经两次传入相同的迭代器。在迭代器上调用iter()只会返回迭代器本身,因此在这种情况下最终只有一个迭代器。