为什么
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
。)
最佳答案
iterable 和iterator 之间是有区别的。您可以使用 iter(x)
为任何给定的可迭代 x
构建迭代器。迭代器封装了迭代的状态,而可迭代对象是您可以从中创建新迭代器的东西。
xrange()
是可迭代对象,但不是迭代器。您可以为单个 xrange()
对象创建多个迭代器,每个迭代器都有自己的位置。
zip()
函数在其每个参数上隐式调用 iter()
。对于 zip(*[xrange(5)]*2)
,这将为相同的 xrange()
对象创建两个迭代器,每个迭代器都有自己的迭代状态。对于 zip(*[iter(xrange(5))]*2)
,您已经两次传入同一个迭代器。在迭代器上调用 iter()
只会返回迭代器本身,因此在这种情况下您最终只会得到一个迭代器。
关于python - 在 xrange 对象上调用多个迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20670525/