为什么
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
也是如此。)
答案 0 :(得分:8)
iterable 和 iterator 之间存在差异。您可以使用iter(x)
为任何给定的可迭代x
构建迭代器。迭代器封装迭代的状态,而可迭代的东西可以从中创建新的迭代器。
xrange()
是一个可迭代的,但不是迭代器。您可以为单个xrange()
对象创建多个迭代器,并且每个对象都有自己的位置。
zip()
函数在每个参数上隐式调用iter()
。对于zip(*[xrange(5)]*2)
,这将为相同的xrange()
对象创建两个迭代器,每个对象都有自己的迭代状态。对于zip(*[iter(xrange(5))]*2)
,您已经两次传入相同的迭代器。在迭代器上调用iter()
只会返回迭代器本身,因此在这种情况下最终只有一个迭代器。