我是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
中?
谢谢你的解释。
丹尼斯
答案 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)