lambda函数和变量范围(Lambda function and variable scope)

2019-09-17 06:51发布

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

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

当我运行我的代码,我的lambda函数需要control是在我的元素列表,这不是我希望发生的最后一个元素。

奇怪的是,当我手动运行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太经常在我的代码。 是否有人看到任何公然错误?

Answer 1:

啪。

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


文章来源: Lambda function and variable scope