我有代码
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)
)
它创建并保存几个应该捕获局部变量的不同值的 lambdaoption
。然而,当使用这些 lambda 表达式时,它们的行为就像options
被设置为"DEBUG"
,它在循环中采用的最后一个值。
我猜这与垃圾收集有关,因为只剩下最后一个选项,但我不知道如何避免这种情况。
请阅读有关最小的例子。在不阅读您的代码的情况下,我相信您已经遇到了之前的问题和答案中解决的一个众所周知的问题,需要两行来说明。函数体中的名称在函数执行时进行评估。
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))
add option=option
before :
捕捉不同的值option
。你可能想重写为
lambda opt=option: self.filter_records(column, opt)
区分循环变量和函数参数。如果column
在循环内改变,则需要相同的处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)