在lambda函数的定义中进行预评估

时间:2014-05-19 00:46:18

标签: python lambda evaluation

我是python的新手,遇到一小段代码的问题,目的是用Qt实现一个菜单:

def setChoice(self,choice=None):
  do something here...

listOfChoices=[choice1,choice2,choice3]

menu=QMenu(self)
  for choice in listOfChoices:
    action=menu.addAction(choice)
    action.triggered.connect(lambda : self.setChoice(choice=choice))

问题是setChoice()函数总是使用choice=choice3调用,{for}循环的最后一个选择。如何妥善解决这个问题?

关于立即部分评估的一个可能相关的问题: 如何从像f= lambda x : x+1这样的代码中保存在内存a=1; f=lambda x: x+a中? 谢谢你的解释。

丹尼斯

1 个答案:

答案 0 :(得分:3)

这是一个麻烦的Python for循环:循环变量在封闭范围内创建,并为每次迭代重新分配。

要解决这个问题,您需要创建一个新的本地范围,以便有一些地方可以“保存”变量:

for choice in listOfChoices:
    def act(choice):
        action=menu.addAction(choice)
        action.triggered.connect(lambda : self.setChoice(choice=choice))
    act(choice)

或者,在第二个问题中,

def act(a):
    return lambda x: x + a
blah = act(1)