Использование лямбда-выражения для подключения слотов в pyqt

Я пытаюсь соединить слоты с лямбда-функциями, но это не работает так, как я ожидаю. В приведенном ниже коде мне удается правильно соединить первые две кнопки. Для вторых двух, которые я соединяю в цикле, это идет не так. У кого-то до меня был такой же вопрос (Qt - Соединить слот с аргументом, используя лямбду), но это решение не работает для меня. Я полчаса смотрю на экран, но не могу понять, чем отличается мой код.

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)

Нажатие первых двух кнопок приводит к «нажатой кнопке 1» и «нажатой кнопке 2», две другие дают «нажатую кнопку ложно», хотя я ожидал 3 и 4.

Я также не полностью понял лямбда-механизм. Что именно связано? Указатель на функцию, сгенерированную лямбда-выражением (с подставленным параметром), или вычисляется ли лямбда-функция при срабатывании сигнала?

Ответы на вопрос(3)

Ваш ответ на вопрос