繁体   English   中英

理解lambda函数重新格式化为闭包

[英]Understanding a lambda function reformatting for closure

我最近遇到了一个问题,我在.q的forq循环中使用lambda函数。 这导致lambda函数关闭的问题,我能够使用functools解决它,但经过一些研究后我发现我可以使用一些不需要导入functools的稍微不同的代码。

使用以下格式的示例代码:

for i in range(0,len(items)):
     items[i].connect( ( lambda i: lambda: func(i) )(i) )

def func(i):
    print('i value ' + str(i))

我不确定为什么会这样。

我试过了

for i in range(0,len(items)):
     items[i].connect( lambda i=i: func(i) )

def func(i):
    print('i value ' + str(i))

这只给出了i的第一个值。 第一个例子正是我想要的,但我不明白它在做什么。 根据我的理解,它会在调用之前返回一个用i计算的函数,但后来我不明白lambda括号之外的(i)是什么。 我也不明白为什么第二个例子对我不起作用。

任何帮助将不胜感激,谢谢。

Python中,第二个示例中lambda定义中的默认值(例如i=i仅在评估函数定义时(不是每次解释语句时)都会被评估。 这意味着i在第一次迭代时被分配,然后永远不会改变。

在你的第一个例子中它起作用,因为lambda的定义没有任何默认值,并且在循环的每次迭代中都会计算一个新的lambda定义。 因为你在执行最拉姆达在每个迭代上传递的支架用于i返回的最里层lambda。 如果在每个闭包中使用不同的变量名,则更容易阅读:

for i in range(0, len(items)):
     items[i].connect( ( lambda x: lambda: func(x) )(i) )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM