Hackerman1
@Hackerman1
17 лет, плохое зрение.

Почему в параметр функции идет только последний индекс?

Используется библиотека Pystray.
Я пытаюсь собрать массив из кнопок, каждая из которых должна передавать индекс своего устройства в функцию, чтобы установить это устройством по умолчанию, но по неведомым причинам при нажатии на любую кнопку приходит только последний индекс. В моем случае индексы 3-ех микрофонов - 4 5 6, и независимо от того, какую кнопку я жму - выбирается индекс 6.

Код
menu_items = []
        for device in only_recording_devices:
            index = device[0][-1]
            is_default = device[1].split('Default              : ')[1]
            name = device[4].split("Name                 : ")[1]
            menu_items.append(MenuItem(f"{index} - {name}", lambda _: set_default_microphone(index),
                                       radio=True))


Общий вид менюшки
674b2b6471dd4258209373.png
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Поздравляю, ты попался на лямбду.
Лямбды сохраняют ссылки на переменные, а не их значения.
lambda _: set_default_microphone(index) сохранит ссылку на index, а потому все лямбды будут видеть одно и то же значение index, которое было установлено последним.
Это можно обойти, сохранив ссылку при объявлении лямбды. Самый простой способ - засунуть сохраняемое значение в значение по умолчанию для неиспользуемого параметра. Значения по умолчанию для параметров вычисляются один раз при объявлении функции, в т.ч. лямбды.
Например, так:
lambda _, *, ind=index: set_default_microphone(ind)

Ну или даже так:
lambda _, *, index=index: set_default_microphone(index)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы