Python中迭代器的静态行为

时间:2016-03-18 13:13:13

标签: python python-3.x iterator

我正在阅读Learning Python by M.Lutz并找到了奇怪的代码块:

>>> 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 个答案:

答案 0 :(得分:6)

这与&#34;静态&#34;无关。对象,它们不存在于Python中。

QGraphicsScene* Sleft; QGraphicsScene* Sright; QGraphicsScene* scene3; 不会创建M的副本.I1和I2都是包装同一对象的迭代器;事实上,由于iter(M)已经是一个迭代器,因此在它上面调用M只返回底层对象:

iter

答案 1 :(得分: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