Lambda函数和变量范围

时间:2012-05-16 03:01:32

标签: python lambda pyqt pyqt4 scope

目前,我的代码是这样的:

for control in self.controls():
  self.connect(control, SIGNAL('clicked()'), lambda: self.button(control.objectName()))

当我运行我的代码时,我的lambda函数将control作为元素列表中的 last 元素,这不是我期望发生的。< / p>

奇怪的是,当我手动运行lambda每个循环时,它适用于每个循环,但它仍然有与以前相同的问题:

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

我的self.button()函数很简单:

def button(self, name):
    print name

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

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

1 个答案:

答案 0 :(得分:2)

SPLAT.

for control in self.controls():
  self.connect(control, SIGNAL('clicked()'), lambda control=control:
    self.button(control.objectName()))
相关问题