You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:15:37