Python生成器函数中try-finally的执行顺序疑问
为什么生成器里的finally会在yield值打印前执行?
先看你给出的代码:
def gen(): try: yield 1 finally: print("finally") def main(): print(next(gen()))
运行后输出:
finally 1
核心原因在于临时生成器对象的销毁时机:
- 调用
gen()时不会立即执行函数体,只是创建一个生成器对象。 - 执行
next(gen())时,生成器启动,走到yield 1时暂停,把1作为next()的返回值。但这里的gen()是临时创建的,没有任何变量保存它——next()拿到返回值后,这个生成器对象就没有引用了,Python会立刻销毁它。 - 生成器被销毁时,不管它是正常结束还是中途暂停,Python都会强制执行
finally块里的代码,所以print("finally")先被执行。 - 最后
print()函数才把next()返回的1输出出来。
如果把代码改成用变量保存生成器对象,顺序就会反过来:
def gen(): try: yield 1 finally: print("finally") def main(): g = gen() # 保存生成器引用 print(next(g))
此时输出就是:
1 finally
因为生成器对象g还被引用着,不会立即销毁,finally会在生成器对象被回收(比如函数结束后)才执行。
内容的提问来源于stack exchange,提问作者wiseacre
相关产品推荐
相关产品推荐

