python - Python 中迭代器的静态行为

标签 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 对象的实例?

最佳答案

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

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

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

关于python - Python 中迭代器的静态行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36085354/

相关文章:

python - 如果从不同的路径导入模块重新导入

python - 修改 automodule 指令下特定类的选项

python - 将 bin 应用于 groupby 的 pandas value_counts 产生不正确的结果

python - 安装 Python 3.6.5 但在 Docker 中获得 Python 3.6.6

python - 在 Python 中连接成对的列表元素

python - 为什么 for 循环阶乘函数比递归函数更快?

swift - 返回泛型集合的迭代器 - Swift 4.2

python - 为 IF Python 语句寻找特殊的 PEP

c++ - 尝试使用取消引用的迭代器进行连接时,无法在字符串 vector 中连接字符串

c++ - 用输入给出的单词填充字符串