繁体   English   中英

Python中迭代器的静态行为

[英]Static behavior of iterators in Python

我正在阅读M.Lutz的学习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对象的实例?

这与“静态”对象无关,而Python中不存在这些对象。

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

>>> iter(M)
<map object at 0x1012272b0>
>>> M
<map object at 0x1012272b0>
>>> M is iter(M)
True

发生这种情况是因为在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM