”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何避免在lambda函数范围和循环中参数中的意外行为?

如何避免在lambda函数范围和循环中参数中的意外行为?

发布于2025-03-24
浏览:562

How to Avoid Unexpected Behavior in Lambda Function Scope and Parameters in Loops?

考虑以下代码,该代码旨在为GUI事件创建呼叫的列表: 打印味精 #使用迭代器的方法不正确 funclist = [] 对于m in('do','re','mi'): Funclist.Append(Lambda:Callback(M)) #正确创建一个方法 funclist = [] Funclist.Append(lambda:callback('do')) Funclist.Append(lambda:callback('re')) Funclist.Append(Lambda:Callback('Mi')) #执行回调功能 对于F Funclist的F: f()

执行时,代码出乎意料地打印: mi mi 做 关于 mi

,而不是预期的输出:

理解lambda函数及其参数的范围至关重要。与常规功能不同,lambda功能引用了创建它们的周围环境。该引用包括Lambda主体内使用的变量。

在不正确的方法中使用迭代器时,对于循环中的每个元素m,它会创建一个新的lambda函数,引用相同的变量m。但是,循环完成后,变量m引用循环中的最后一个元素,即“ mi”。因此,当执行回调函数时,它们都使用更新的引用。解决此问题的解决方案可以捕获lambda函数的lambda函数的值for IT作为deveault of optional参数(a optional参数),我们可以捕获lambda函数的值

。 're','mi'): Funclist.Append(lambda m = m:callback(m))

现在,在每个lambda函数中,m被捕获为局部变量,并且在循环完成时将其值保留。因此,当执行回调函数时,它们会打印正确的值,从而产生预期的输出。

版本声明 本文转载于:1729329977如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3