2014-05-19 157 views
0

我是新来的Python和遇到一个问题,旨在实现使用Qt的菜单一小块代码的定义:预评估lambda函数

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循环的最后一个选择。如何正确解决这个问题?

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

丹尼斯

回答

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)