有人可以解释这两种执行之间的区别吗?这是我的生成器函数:
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()
返回生成器的第一个产量,但显然引发了异常。为什么会出现这种情况?
在第一个场景中,生成器在
next()
之后被垃圾收集,最终触发并引发异常。在第二个中,生成器由 x 保留,防止这种情况发生并允许正常运行。