【发布时间】:2018-04-29 21:37:31
【问题描述】:
我认为我的问题与this 有关,但并不完全相同。考虑这段代码:
def countdown(n):
try:
while n > 0:
yield n
n -= 1
finally:
print('In the finally block')
def main():
for n in countdown(10):
if n == 5:
break
print('Counting... ', n)
print('Finished counting')
main()
这段代码的输出是:
Counting... 10
Counting... 9
Counting... 8
Counting... 7
Counting... 6
In the finally block
Finished counting
是否保证在“完成计数”之前打印“在 finally 块中”行?还是因为 cPython 的实现细节,当引用计数达到 0 时,对象将被垃圾回收。
我也很好奇countdown 生成器的finally 块是如何执行的?例如如果我将main 的代码更改为
def main():
c = countdown(10)
for n in c:
if n == 5:
break
print('Counting... ', n)
print('Finished counting')
然后我确实看到Finished counting 打印在In the finally block 之前。垃圾收集器如何直接到finally块?我想我一直认为try/except/finally 的表面价值,但在发电机的背景下思考让我三思而后行。
【问题讨论】:
-
垃圾收集器不保证在特定时间收集引用。
标签: python generator python-internals