4

現在、私のコードは次のようになっています。

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

andの出力を出力してcontrolfuncすべてのループの一意性をチェックしたところ、それらはすべて一意の番号を返しました。それとは別に、正しいオブジェクト名です。id(control)id(func)control.objectName()

lambda通常、コードで sをあまり使用しないため、これは可変スコープの問題であると感じています。露骨な間違いを見た人はいますか?

4

1 に答える 1

2

スプラット。

for control in self.controls():
  self.connect(control, SIGNAL('clicked()'), lambda control=control:
    self.button(control.objectName()))
于 2012-05-16T03:04:25.773 に答える