Python中迭代器的静态行为

4

我正在阅读 M.Lutz的Learning Python,发现了一段奇怪的代码块:

>>> M = map(abs, (-1, 0, 1))
>>> I1 = iter(M); I2 = iter(M)
>>> print(next(I1), next(I1), next(I1))
1 0 1
>>> next(I2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

为什么当我调用next(I2)时,迭代已经结束了? 难道我没有创建两个独立的I1I2实例吗?为什么它的行为就像一个static对象的实例一样?
2个回答

6
这与Python中不存在的“静态”对象无关。 iter(M)不会创建M的副本。I1和I2都是包装同一对象的迭代器;实际上,由于M已经是一个迭代器,在其上调用iter只返回底层对象:
>>> iter(M)
<map object at 0x1012272b0>
>>> M
<map object at 0x1012272b0>
>>> M is iter(M)
True

4
这是因为在Python 3.X中,map对象只能被迭代一次。多个迭代器指向它不会将其重置为起始状态。
与2.7中的map行为相比较。它返回一个列表,因此可以被多次迭代。
>>> M = map(abs, (-1, 0, 1))
>>> I1 = iter(M); I2 = iter(M)
>>> print(next(I1), next(I1), next(I1))
(1, 0, 1)
>>> next(I2)
1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接