首页 >后端开发 >Python教程 >为什么 For 循环中的 Lambda 只捕获最后一个值?

为什么 For 循环中的 Lambda 只捕获最后一个值?

Barbara Streisand
Barbara Streisand原创
2024-12-05 01:47:09400浏览

Why Do Lambdas in For Loops Only Capture the Last Value?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn