For 循环中的 Lambda 仅捕获最后一个值
在 for 循环中使用 lambda 函数时,了解其关于本地的行为至关重要变量捕获。默认情况下,lambda 捕获定义 lambda 时的局部变量的值。但是,如果这些变量在循环内发生变化,则 lambda 将始终捕获它们所采用的最终值。
代码示例:
考虑以下代码:
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda: self.filter_records(column, option) )
此代码旨在创建多个 lambda,每个 lambda 捕获选项变量的不同值。但是,当执行这些 lambda 时,它们的行为就好像选项设置为“DEBUG”,即它在循环中采用的最后一个值。
原因:
出现此行为是因为执行函数时会计算 lambda 函数体内的名称。因此,在提供的代码中,在调用每个 lambda 时都会评估 option 变量,从而仅捕获 option 的最终值。
解决方案:
为了避免这个问题,有必要在定义 lambda 时捕获 option 的值。这可以通过将 option 分配给 lambda 中的新变量来实现,如下面修改后的代码所示:
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda opt=option: self.filter_records(column, opt) )
通过在 lambda 中使用 opt 参数,当时会捕获 option 的值创建 lambda,确保每个 lambda 使用正确的值进行操作。
以上是为什么 For 循环中的 Lambda 只捕获最后一个值?的详细内容。更多信息请关注PHP中文网其他相关文章!