【发布时间】:2017-04-02 18:32:18
【问题描述】:
我有两个返回函数列表的函数。这些函数接受一个数字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 个函数的列表,每个函数都将 9 添加到 x,因为 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 中 yielding 会形成闭包吗?
【问题讨论】:
-
试试
sum(t(1) for t in list(test_with_yield()))。你会得到100。当您在第二次求和中评估t(1)时,生成器尚未将i推进到下一个值。test_with_yield的执行被暂停并存储,直到请求下一个值。 -
把 python 的闭包想象成总是在做 reference 复制,而不是 value 复制,你就会明白它的行为...
标签: python functional-programming closures yield