Python Lambda函数与变量作用域

Python Lambda函数与变量作用域,python,lambda,pyqt,pyqt4,scope,Python,Lambda,Pyqt,Pyqt4,Scope,目前,我的代码如下: for control in self.controls(): self.connect(control, SIGNAL('clicked()'), lambda: self.button(control.objectName())) 当我运行代码时,我的lambda函数将control作为元素列表中的最后一个元素,这不是我所期望的结果 奇怪的是,当我手动运行lambdaeach循环时,它对每个循环都能正常工作,但最终仍然存在与以前相同的问题: for control

目前,我的代码如下:

for control in self.controls():
  self.connect(control, SIGNAL('clicked()'), lambda: self.button(control.objectName()))
当我运行代码时,我的
lambda
函数将
control
作为元素列表中的最后一个元素,这不是我所期望的结果

奇怪的是,当我手动运行
lambda
each循环时,它对每个循环都能正常工作,但最终仍然存在与以前相同的问题:

for control in self.controls():
  func = lambda: self.button(control.objectName())
  func() # Prints the correct output

  self.connect(control, SIGNAL('clicked()'), func) # When triggered, still breaks
My
self.button()
函数的定义很简单:

def button(self, name):
    print name
我通过打印
id(control)
id(func)
的输出来检查
control
func
每个循环的唯一性,它们都返回了唯一的数字。除此之外,
control.objectName()
是正确的对象名称

我觉得这是一个可变范围的问题,因为我通常不会在代码中太频繁地使用
lambda
s。有人看到任何明显的错误吗?


作为一个旁注:考虑使用。@阿瓦里斯:在我发布我的问题后,我就切换了。谢谢你的链接,虽然,我不知道有官方文件。
for control in self.controls():
  self.connect(control, SIGNAL('clicked()'), lambda control=control:
    self.button(control.objectName()))