素材牛VIP会员
python yield 和finally 相关的一个问题
 马***1  分类:Python  人气:924  回帖:3  发布于6年前 收藏

请问下面两种方式的代码,输出结果顺序为什么不一样?
code1输出为:
end
65
而code2输出为:
65
end

code 1:

def af():
    a=65
    try:
       yield a

    finally:
        print('end')

print(af().next())

code 2:

def af():
    a=65
    try:
       yield a

    finally:
        print('end')

g=af()
print(g.next())
 标签:python

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv1 新人
飘***子 JS工程师 6年前#1

finally里的内容会在析构时执行,所以af先出现end

Lv2 入门
Br***23 产品经理 6年前#2

PEP 342: finally 一定会被执行,无论生成器是否执行结束,finally实际是被garbage collection执行的。所以你直接af().next()时,af()是个临时对象,会在print调用之前先被gc回收,自然先出现end,而g.next()则是正常的方式,g在主程序结束前始终存在,所以end出现在程序运行结束之后,即python在主程序运行结束后运行gc才会执行finally里面的内容

Lv5 码农
em***co PHP开发工程师 6年前#3

说说我的理解。
如果不实例化一个生成器,直接调用af().__next__方法后,生成器会被“关闭”,“关闭”前会执行finally。
实例化生成器g,调用g.__next__()方法后,g并不会“关闭”,自然也就暂时不会执行finally,直到stopiteration或主程序结束才执行finally。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取