今天有个同学问我这个题,我看了半天也没明白
def get_funs(n):
L = []
for i in range(n):
L.append(lambda x: x * i) # 这里追加的是一个函数
return L # return 的是一个函数列表
funs = get_funs(4)
print(funs[0](10)) # 30
print(funs[1](10)) # 30
print(funs[2](10)) # 30
但是为什么 i 永远都是最后一次循环的值
后来在我的Python宝典里找到了答案,是一个相同的题目
def multipliers():
return [lambda x : i * x for i in range(4)]
print [m(2) for m in multipliers()]
上面代码输出的结果是[6, 6, 6, 6] (不是我们想的[0, 2, 4, 6] )。
上述问题产生的原因是 Python 闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内 进行查找。因此,当任何由 multipliers()返回的函数被调用时,i 的值将在附近的范围进行查找。那时, 不管返回的函数是否被调用,for 循环已经完成,i 被赋予了最终的值 3。