关于python:lambda函数定义中的预评估

pre-evaluation in a definition of a lambda function

本问题已经有最佳答案,请猛点这里访问。

我对python不太熟悉,遇到了一个小代码问题,它的目标是用qt实现一个菜单:

1
2
3
4
5
6
7
8
9
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在内存中?谢谢你的解释。

丹尼斯


这是python for循环的一个棘手的问题:循环变量在封闭范围内创建,并为每个迭代重新分配。

为了解决这个问题,您需要创建一个新的本地作用域,以便有一些地方可以"保存"变量:

1
2
3
4
5
for choice in listOfChoices:
    def act(choice):
        action=menu.addAction(choice)
        action.triggered.connect(lambda : self.setChoice(choice=choice))
    act(choice)

或者,在第二个问题中,

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