【问题标题】:Why does this create a StopIteration error? [duplicate]为什么这会产生 StopIteration 错误? [复制]
【发布时间】:2020-10-11 06:45:10
【问题描述】:

为什么会这样

a = (i for i in range(2))
b = a
c = a
for i in b:
    print("ok")
next(c)

导致这个?

StopIteration                             Traceback (most recent call last)

<ipython-input-37-9c481bb09894> in <module>()
      54 for i in b:
      55   print("ok")
 ---> 56 next(c)

StopIteration: 

我目前正在学习 Python 中的生成器。我的目标是将 a 设置为生成器,创建 a 的 b 和 c 实例,并分别使用 b 和 c。出了什么问题?

此外,当我使用 yield 而不是基于 () 的生成器 a 设置类似的函数时,一切都很顺利。

【问题讨论】:

  • bc 指向同一个生成器。您使用 for 循环使用生成器,使其 为空,因此在询问下一个时,您会遇到 StopIteration 错误
  • @azro 谢谢,到目前为止听起来很合理。因此,如果我使用带有 yield 而不是 () 的函数,它会起作用,因为它每次都单独调用函数,生成独立的对象,而在这里我只创建到原始对象的“链接”?
  • 目标是创建新实例,您不需要yield repl.it/repls/RemoteAdventurousDemoware
  • @azro 有道理,感谢您的帮助和时间。

标签: python generator


【解决方案1】:

b 和 c 都指向同一个生成器对象,当你循环通过生成器 b 时,它也在消耗 c 的元素,所以一旦你消耗了 b 的所有元素, 并尝试用 c 消耗它,即通过 next(c) 它会给你 StopIteration 错误。

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 2012-08-09
    • 1970-01-01
    • 2013-05-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多