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

时间:2012-06-18 07:35:04

标签: python

我正在尝试使用for循环将多个编号的命令添加到Tkinter菜单。当调用命令时,它的编号应该用作命令函数的参数。以下代码不起作用,因为在调用命令时评估i,即在循环完成之后。这意味着传递给function1的参数始终为15,而我通过传递命令标签上显示的数字。有没有办法实现这个目标?

注意:标签按预期工作,产生16个标记为0到15的选项

newMenu = Menu(menuButtonInstance)
for i in range(16):
    newMenu.add_command(label = '%s'%i,
                        command = lambda:function1(i))
menuButtonInstance.config(menu = newMenu)

提前致谢

1 个答案:

答案 0 :(得分: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}}