如何在lambda表达式中使用循环变量

4
我正在尝试使用for循环向Tkinter菜单添加多个编号命令。当调用命令时,它的编号应该被用作传递给命令函数的参数。以下代码不起作用,因为i在命令被调用时进行评估,而这是在循环结束后。这意味着传递给function1的参数始终为15,而我想传递显示在命令标签上的数字。有没有办法实现这一点?
注意:标记按预期工作,产生标记为0到15的16个选项。
newMenu = Menu(menuButtonInstance)
for i in range(16):
    newMenu.add_command(label = '%s'%i,
                        command = lambda:function1(i))
menuButtonInstance.config(menu = newMenu)

感谢您的提前帮助。
1个回答

4

处理lambda的延迟绑定常用的一种方法是给lambda一个带有默认值的参数,设置为可变的变量:

    newMenu.add_command(label='{0}'.format(i),
                        command=lambda x=i: function1(x))

另一种可能性是使用functools中的partial函数:
    newMenu.add_command(label='{0}'.format(i),
                        command=partial(function1, i))

(注意,PEP8建议在关键字参数中使用=时不要在两侧使用空格字符。另一方面,在所有运算符周围都应该放置空格字符,例如你的示例中的%

1
在我看来,“partial”方法要好得多。默认参数技巧是一种奇怪的hack,会让人误以为默认参数可以被替换。 - Karl Knechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接