Usando la expresión lambda para conectar ranuras en pyqt

Estoy tratando de conectar ranuras con funciones lambda, pero no funciona de la manera que esperaba. En el siguiente código, logro conectar los dos primeros botones correctamente. Para los dos segundos, que conecto en un bucle, esto sale mal. Alguien antes que yo tenía la misma pregunta (Qt - Conectar ranura con argumento usando lambda), pero esta solución no funciona para mí. He estado mirando mi pantalla durante media hora, pero no puedo entender cómo mi código es diferente.

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(QtGui.QWidget, self).__init__()

        main_layout = QtGui.QVBoxLayout(self)

        # Works:
        self.button_1 = QtGui.QPushButton('Button 1 manual', self)
        self.button_2 = QtGui.QPushButton('Button 2 manual', self)
        main_layout.addWidget(self.button_1)
        main_layout.addWidget(self.button_2)

        self.button_1.clicked.connect(lambda x:self.button_pushed(1))
        self.button_2.clicked.connect(lambda x:self.button_pushed(2))

        # Doesn't work:
        self.buttons = []
        for idx in [3, 4]:
            button = QtGui.QPushButton('Button {} auto'.format(idx), self)
            button.clicked.connect(lambda x=idx: self.button_pushed(x))
            self.buttons.append(button)
            main_layout.addWidget(button)


    def button_pushed(self, num):
        print 'Pushed button {}'.format(num)

Al presionar los dos primeros botones se obtiene el 'botón presionado 1' y el 'botón presionado 2', los otros dos producen el 'botón presionado falso', aunque esperaba 3 y 4.

Tampoco he entendido completamente el mecanismo lambda. ¿Qué se conecta exactamente? ¿Un puntero a una función generada por lambda (con el parámetro sustituido) o la función lambda se evalúa cada vez que se activa la señal?

Respuestas a la pregunta(3)

Su respuesta a la pregunta