Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表中的lambda函数是如何工作的:Python?_Python_List_Lambda - Fatal编程技术网

列表中的lambda函数是如何工作的:Python?

列表中的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中,

我有下面列出的代码。我不知道为什么回报率应该是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中,闭包变量的值在外部函数结束时冻结,而不是在创建内部函数时冻结。是的,它使用的是
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您在技术上是正确的。。。最好的一种是正确的。