我正在阅读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)
时,迭代已经结束?
我没有创建I1
和I2
的两个单独的实例。为什么它的行为类似于static
对象的实例?
答案 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