lambda i = i: foo (i) in para bucle no funciona

Primero lee esto . Se trata de lambda x=x: foo(x) captura x incluso en bucle for .

Esta es una ventana con etiqueta y dos botones generados en bucle. Cuando se hace clic en el botón, su nombre aparece en la etiqueta.

Si usamos lambda: label.setText("button -- " + str(i)) habitual lambda: label.setText("button -- " + str(i)) , entonces el resultado es el último i en el bucle, sin importar qué botón se presione:
lambda: foo (i)
Y esto es correcto.

Cuando cambiamos a lambda i=i: label.setText("button -- " + str(i)) (snipet) y esperamos que ahora todo esté bien, el resultado es:
lambda i = i: foo (i)]
¡Falso!

¿De dónde viene este False ?

 import sys from PyQt4.QtGui import * class MainWindow(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) vbox = QVBoxLayout(self) # label for action label = QLabel('') vbox.addWidget(label) # adding buttons for i in range (1, 3): btn = QPushButton(str(i)) btn.clicked.connect( lambda i=i: label.setText("button " + str(i)) ) vbox.addWidget(btn) app = QApplication(sys.argv) myapp = MainWindow() myapp.show() sys.exit(app.exec_()) 

¿Por qué esta solución no funciona como debería? ¿Qué significa esto false ?

Sé que puedes hacer foo_factory , como en el primer enlace, pero la pregunta es qué está mal con lambda i=i: foo(i)

No tengo PyQt4 instalado para probar en este mismo instante, pero me parece claro que cuando se llama a su callback lambda, se le está dando un argumento. i es entonces igual a lo que sea el argumento, en lugar del valor predeterminado. Intenta esto y dime si funciona (o si al menos cambia la salida):

 btn.clicked.connect( lambda throw_away=0, i=i: label.setText("button " + str(i)) ) 

La señal “pulsada” pasa un argumento booleano a su ranura lambda conectada.
Documentación

Lo que estás tratando de lograr se hace mejor con esto:

 btn.clicked.connect( lambda clicked, i=i : label.setText("button " + str(i)) )