我有两个返回函数列表的函数。这些函数接受一个数字x
并将i
添加到它上面。i
是从0-9递增的整数。
def test_without_closure():
return [lambda x: x+i for i in range(10)]
def test_with_yield():
for i in range(10):
yield lambda x: x+i
我预期
test_without_closure
返回一个包含10个函数的列表,每个函数将 x
加上 9
,因为 i
的值是 9
。print sum(t(1) for t in test_without_closure()) # prints 100
我原以为test_with_yield
也会有同样的行为,但它正确地创建了10个函数。
print sum(t(1) for t in test_with_yield()) # print 55
我的问题是,Python中的yield是否形成闭包?
sum(t(1) for t in list(test_with_yield()))
,结果会是100
。当你在第二个求和中评估t(1)
时,生成器尚未将i
推进到下一个值。执行test_with_yield
的过程被暂停并存储,直到下一个值被请求。 - Patrick Haugh