如何将字符串变量作为“常量”传递给lambda函数?

时间:2019-04-05 21:52:43

标签: python button lambda parameter-passing pass-by-reference

如果我运行以下代码:

def handleButtonClicked(button_name):
    print(button_name)

for button_name in ['A','B']:
    if button_name == 'A':
        buttons[button_name].button.clicked.connect(lambda: handleButtonClicked(button_name='A'))
    if button_name == 'B':
        buttons[button_name].button.clicked.connect(lambda: handleButtonClicked(button_name='B'))

然后单击按钮A,然后单击按钮B,根据需要,输出为“ A”,然后为“ B”。但是如果我有代码:

for button_name in ['A','B']:
    buttons[button_name].button.clicked.connect(lambda: handleButtonClicked(button_name=button_name))

单击任一按钮将输出'B',因为它是传递给lambda的button_name的最后一个值!为什么是这样? (我知道第一种方法有效,我只是好奇为什么会发生这种情况,以及是否有解决方案)。然后lambda中的函数使用变量本身而不是值,从而传递其最后一个值吗?我该如何将字符串“变量”复制到自己的“常量”中,以便像第二个代码片段一样在一行中完成?

1 个答案:

答案 0 :(得分:1)

我建议使用functools.partial

from functools import partial

for button_name in ['A', 'B']:
    f = partial(handleButtonClicked, button_name=button_name)
    buttons[button_name].button.clicked.connect(f)

它返回一个可调用对象,该对象内部使用创建时设置的参数调用handleButtonClicked