2014-05-19 192 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)