rua*_*hao 4 python generator python-3.x try-except
我遇到了一段Python 3代码:
def gen():
try:
while True:
yield 1
finally:
print("stop")
print(next(gen()))
Run Code Online (Sandbox Code Playgroud)
运行它之后,我首先想到的输出应该是:
def gen():
try:
while True:
yield 1
finally:
print("stop")
print(next(gen()))
Run Code Online (Sandbox Code Playgroud)
但实际上结果是:
1
Run Code Online (Sandbox Code Playgroud)
怎么会这样 引擎盖下发生了什么?
如果我运行for i in gen(): print(i),将会出现一个无限循环,这正是我所期望的。for和next这里和有什么不一样?
当生成器关闭时循环终止,如果你不保存对它的引用,它会自动发生。一旦发生这种情况,该try语句保证finally在生成器对象被垃圾收集之前执行该块。相比:
>>> next(gen())
stop
1
Run Code Online (Sandbox Code Playgroud)
和
>>> x = gen()
>>> next(x)
1
Run Code Online (Sandbox Code Playgroud)
对生成器对象的垃圾回收执行finally子句。
请考虑以下两种情况:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)