def multipliers():
l = []
for i in range(4):
l.append(lambda x : x * i )
return l
>>> ll[0](2)
6
>>> ll[1](2)
6
>>> ll[2](2)
6
>>> ll[3](2)
6
你能在这里解释一下结果吗?我希望得到:
0
2
4
6
答案 0 :(得分:4)
原因是Python的闭包是late binding。这意味着在调用内部函数时会查找闭包中使用的变量值。因此,当调用multipliers()
返回的任何函数时,i
的值将在当时的周围范围中查找。到那时,无论调用哪个返回函数,for循环都已完成,i
的最终值为3
。因此,每个返回的函数乘以3
传递的值,因此在上面的代码中传递2
的值,它们都返回值6
答案 1 :(得分:2)
问题是,正如人们所说,i
不是lambda
的局部变量。
您必须解决这个问题:使用在循环期间更改的默认参数值:
>>> def multipliers():
l = []
for i in range(4):
l.append(lambda x, i=i : x * i )
return l
>>> lst = multipliers()
>>> lst[0](2)
0
>>> lst[1](2)
2
>>> lst[2](2)
4
>>> lst[3](2)
6
>>>
答案 2 :(得分:1)
i
的值未存储在lambda
函数中。这就是你得到你所看到的结果的原因:Python正在使用它在调用函数时找到的i
的值。