首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >try-finally in Python 3生成器

try-finally in Python 3生成器
EN

Stack Overflow用户
提问于 2019-05-09 23:31:19
回答 2查看 1.1K关注 0票数 8

我见过Python 3代码的一小段:

代码语言:javascript
复制
def gen():
    try:
        while True:
            yield 1
    finally:
        print("stop")

print(next(gen()))

在我运行它之后,我最初认为输出应该是:

代码语言:javascript
复制
1

但实际上结果是:

代码语言:javascript
复制
stop
1

这怎么会发生呢?引擎盖下发生了什么?

如果我运行for i in gen(): print(i),将会有一个我所期望的无限循环。这里的fornext有什么不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-09 23:57:52

正在对生成器对象的垃圾回收执行finally子句。

考虑以下两种情况:

代码语言:javascript
复制
def gen():
    try:
        while True:
            yield 1
    finally:
        print("stop")

g1 = gen(); print('first time')
print(next(g1))
g2 = gen(); print('second time')  # no stop will be printed because we haven't hit the finally clause yet
代码语言:javascript
复制
def gen():
    try:
        while True:
            yield 1
    finally:
        print("stop")

g = gen(); print('first time')
print(next(g))
g = gen(); print('second time')   # stop will be printed when the first object g was assigned to is garbage collected
票数 9
EN

Stack Overflow用户

发布于 2019-05-09 23:59:03

当生成器关闭时,循环终止,如果您不保存对它的引用,则会自动发生这种情况。一旦发生这种情况,try语句就会保证在生成器对象被垃圾回收之前执行finally块。比较:

代码语言:javascript
复制
>>> next(gen())
stop
1

使用

代码语言:javascript
复制
>>> x = gen()
>>> next(x)
1
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56062909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档