for 循环中的 lambda 仅取最后一个值[重复]
- 2024-12-09 08:30:00
- admin 原创
- 73
问题描述:
我有代码
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 应该捕获局部变量 的不同值option
。但是,当使用这些 lambda 时,它们的行为都好像options
被设置为"DEBUG"
,即它在循环中采用的最后一个值。
我猜测这与垃圾收集有关,因为只剩下最后一个选项,但我不知道如何避免这种情况。
解决方案 1:
请阅读有关最小示例的内容。无需阅读您的代码,我相信您已经遇到了之前的问题和答案中提到的一个众所周知的问题,需要两行来说明。执行函数时,将评估函数主体中的名称。
funcs = [lambda: i for i in range(3)]
for f in funcs: print(f())
打印 '2' 3 次,因为这 3 个函数是相同的,并且每个函数中的 'i' 直到调用时才被求值,即 i == 2。然而,
funcs = [lambda i=i:i for i in range(3)]
for f in funcs: print(f())
生成三个不同的函数,每个函数捕获的值都不同,因此会打印 0、1 和 2。在您的语句中
__cMenu.add_command(label="{}".format(option),
command=lambda: self.filter_records(column, option))
option=option
在 之前添加:
来捕获 的不同值option
。您可能希望将其重写为
lambda opt=option: self.filter_records(column, opt)
区分循环变量和函数参数。如果column
在循环内改变,则需要相同的处理。
解决方案 2:
Python 中的闭包捕获变量,而不是值。例如考虑:
def f():
x = 1
g = lambda : x
x = 2
return g()
您期望调用的结果f()
是什么?正确答案是 2,因为 lambdaf
捕获的是变量 x
,而不是创建时的值 1 。
现在如果我们例如写:
L = [(lambda : i) for i in range(10)]
我们创建了一个包含 10 个不同 lambda 的列表,但是它们都捕获了相同的变量i
,因此调用L[3]()
结果将是 9,因为i
迭代结束时变量的值是9
(在 Python 中,理解不会为每次迭代创建一个新的绑定;它只是不断更新相同的绑定)。
在 Python 中,捕获所需语义的值时经常看到的一个“技巧”是使用默认参数。在 Python 中,与 C++ 不同,默认值表达式是在函数定义时(即创建 lambda 时)而不是在调用函数时进行评估的。因此在如下代码中:
L = [(lambda j=i: j) for i in range(10)]
我们声明一个参数,并将创建 lambda 时j
的当前值设置为默认值。这意味着,当调用时,由于“隐藏”参数的默认值,结果这次将为 3(调用当然会返回 42)。i
`L[3]()`L[3](42)
你更常看到的是更令人困惑的形式
lambda i=i: ...
其中“隐藏”参数与我们想要捕获其值的变量具有相同的名称。
解决方案 3:
我知道我迟到了,但是我找到了一个可以完成工作的混乱解决方法(在 Python 3.7 中测试)
如果您使用双 lambda(就像我说的,非常混乱)您可以保留该值,如下所示:
步骤 1:创建嵌套的 lambda 语句:
send_param = lambda val: lambda: print(val)
第 2 步:使用 lambda 语句:
send_param(i)
该send_param
方法返回最内层的 lambda( lambda: print(val)
) 而不执行语句,直到你调用send_param
不带参数的结果,例如:
a = send_param(i)
a()
仅第二行会执行该print
语句。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件