Захват переменных в лямбда-функциях
При использовании лямбда-функций внутри цикла важно понимать область видимости их переменных. В отличие от обычных функций, копирующих локальные переменные, лямбда-функции ссылаются на них.
Рассмотрим данный код:
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(m))
Здесь лямбда-функция фиксирует значение m из охватывающей области. Однако после завершения цикла m сохраняет последнее значение («mi»). Когда вызывается каждая лямбда-функция, она ссылается на эту общую переменную m, в результате чего на выходе несколько раз выводится «mi».
Чтобы решить эту проблему и гарантировать, что каждая лямбда-функция захватывает отдельное значение m, используйте метод под названием " аргументы по умолчанию":
for m in ('do', 're', 'mi'):
funcList.append(lambda m=m: callback(m))
Сделав m параметром по умолчанию с тем же именем, каждая лямбда захватывает свой собственный экземпляр переменной, обеспечивая ожидаемый результат:
"до"
"пере"
"ми"
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3