我遇到了Python 3代码的一个片段:
def gen():
try:
while True:
yield 1
finally:
print("stop")
print(next(gen()))
在我运行它之后,我起初以为输出应该是:
但实际上结果是:
stop
1
怎么会这样?引擎盖下发生了什么?
如果我运行for i in gen(): print(i)
,将会出现一个无限循环,这正是我所期望的。这里for
和next
的区别是什么?
3条答案
按热度按时间dw1jzc5e1#
正在对生成器对象的垃圾回收执行finally子句。
请考虑以下两种情况:
g9icjywg2#
生成器关闭时循环终止,如果不保存对它的引用,则会自动关闭。一旦关闭,
try
语句保证finally
块在生成器对象被垃圾回收之前执行。与
5rgfhyps3#
我在为未来的读者回答一个老问题。
生成器中的
finally
子句将在解释器在生成器内部执行代码时到达它时执行,或者在解释器在生成器内部执行代码时没有到达它的情况下,在生成器被终止(删除)时执行。您可以阅读引用。(请参阅以"Yield expressions are allowed anywhere"开头的段落。)下面的示例演示了这一点。
这将输出以下内容。
对于
for
循环的第二个问题,我将给出一个示例。上面的代码等效于下面的代码。