【问题标题】:Static behavior of iterators in PythonPython中迭代器的静态行为
【发布时间】:2016-03-18 13:13:12
【问题描述】:

我正在阅读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 对象的实例?

【问题讨论】:

    标签: python python-3.x iterator


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这是因为在 Python 3.X 中,map 对象只能迭代一次。将多个迭代器指向它不会将其重置为其起始状态。

      比较map 在 2.7 中的行为。它返回一个列表,因此可以多次迭代。

      >>> 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-04
        • 2015-05-20
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 2013-11-17
        • 2015-06-06
        相关资源
        最近更新 更多