列表中的lambda函数是如何工作的:Python?
我有下面列出的代码。我不知道为什么回报率应该是4列表中的lambda函数是如何工作的:Python?,python,list,lambda,Python,List,Lambda,我有下面列出的代码。我不知道为什么回报率应该是4 def create_multiplier(): return [lambda x: x*i for i in range(10)] f = create_multiplier() print f[1](1) 结果是4。我熟悉lambda函数,类似于lambda x:x*2,但对这个非常困惑。它似乎得到了i的最后一次迭代,例如: for i in range(5): i print i 在Python中,
def create_multiplier():
return [lambda x: x*i for i in range(10)]
f = create_multiplier()
print f[1](1)
结果是4。我熟悉lambda函数,类似于lambda x:x*2,但对这个非常困惑。它似乎得到了i的最后一次迭代,例如:
for i in range(5):
i
print i
在Python中,闭包变量的值在外部函数结束时冻结,而不是在创建内部函数时冻结。是的,它使用的是
i
的最后一个值。要避免这种情况,可以使用默认参数:
return [lambda x, i=i: x*i for i in range(10)]
编辑:作为注释,闭包变量在技术上并没有冻结,只是在您的情况下,没有任何方法可以更改它。但在其他情况下,它也可以更改。在Python中,闭包变量的值在外部函数结束时冻结,而不是在创建内部函数时冻结。是的,它使用的是
i
的最后一个值。要避免这种情况,可以使用默认参数:
return [lambda x, i=i: x*i for i in range(10)]
编辑:作为注释,闭包变量在技术上并没有冻结,只是在您的情况下,没有任何方法可以更改它。但也有其他情况可以更改它。在我的Python 3.5.2中,当我在print语句中使用外圆括号(以避免语法错误)时,我会将结果
9
作为打印输出。你确定得到的是4而不是9吗?如果是这样,您是否确定您发布的代码与您运行的代码完全匹配,包括范围
的参数?打印(f[0])
为您提供
。那是什么东西?由于lambda
引用局部变量i
,因此它是绑定到create\u multiplier
函数的局部变量的闭包。(每次执行函数时,python都会创建一个对象,该对象保存其局部变量)。当函数退出时,它的i
变量是9,因此在闭包中得到的是9。由于所有10个lambda最终都做了完全相同的事情,我怀疑这是代码中的一个bug。在我的Python 3.5.2中,当我在print语句中使用外圆括号时(为了避免语法错误),我得到的结果是打印输出的9
。你确定得到的是4而不是9吗?如果是这样,您是否确定您发布的代码与您运行的代码完全匹配,包括范围
的参数?打印(f[0])
为您提供
。那是什么东西?由于lambda
引用局部变量i
,因此它是绑定到create\u multiplier
函数的局部变量的闭包。(每次执行函数时,python都会创建一个对象,该对象保存其局部变量)。当函数退出时,它的i
变量是9,因此在闭包中得到的是9。由于所有10个lambda最终都做了完全相同的事情,我怀疑这是代码中的一个bug。“当外部函数结束时,闭包变量的值被冻结”-即使在那时也不会,因为使用非局部的内部函数仍然可以更改它。价值永远不会被冻结;每次使用变量时都会查找它。@user2357112您在技术上是正确的。。。最好的一种正确方法是:“当外部函数结束时,闭包变量的值被冻结”-即使在那时也不会,因为使用非局部的内部函数仍然可以更改它。价值永远不会被冻结;每次使用变量时都会查找它。@user2357112您在技术上是正确的。。。最好的一种是正确的。