未分配给变量时生成器的意外行为

问题描述 投票:0回答:1

有人可以解释这两种执行之间的区别吗?这是我的生成器函数:

def g(n):
    try:
        yield n
        print("first")
    except BaseException as e:
        print(f"exception {e}")
        raise e
    finally:
        print("second")

当我执行时:

>>> a = next(g(2))
exception
second

有人可以解释为什么

a = next(g(2))
会引发异常吗?与下面的执行有什么区别?

>>> x = g(2)
>>> next(x)
2

我的期望是,当我执行

a = next(g(2))
时,函数
g(2)
返回一个生成器,而
next()
返回生成器的第一个产量,但显然引发了异常。为什么会出现这种情况?

python exception generator
1个回答
0
投票

在第一个场景中,生成器在

next()
之后被垃圾收集,最终触发并引发异常。在第二个中,生成器由 x 保留,防止这种情况发生并允许正常运行。

© www.soinside.com 2019 - 2024. All rights reserved.