rafpe функций Lambda и их параметры
functs Lambda, представленные в Python в виде кратких анонимных функций, предложить удобство в различных сценариях. Однако понимание их параметров может иметь решающее значение, чтобы избежать неожиданного поведения. Давайте рассмотрим общую проблему, которая возникает при использовании функций Lambda в циклах. Печать MSG # Неправильный подход с использованием итератора funclist = [] для m in ('do', 're', 'mi'): funclist.append (лямбда: обратный вызов (m)) # Правильный подход Создание по одному за раз funclist = [] funclist.append (лямбда: обратный вызов ('do')) funclist.append (лямбда: обратный вызов ('re')) funclist.append (лямбда: обратный вызов ('mi')) # Выполнить функции обратного вызова для F в Funclist: f ()
, когда выполняется, код неожиданно печатает: mi мио мио делать репутация mi
вместо ожидаемого вывода:
def callback(msg): print msg # Incorrect approach using an iterator funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) # Correct approach creating one at a time funcList = [] funcList.append(lambda: callback('do')) funcList.append(lambda: callback('re')) funcList.append(lambda: callback('mi')) # Execute the callback functions for f in funcList: f()
объяснение
mi mi mi do re mi
понимание объема функций Lambda и их параметры здесь имеет решающее значение. В отличие от обычных функций, Lambda функционирует, ссылается на окружающую среду, в которой они создаются. Эта ссылка включает в себя переменные, используемые в теле Lambda.
do re mi do re mi
Solution
, чтобы решить эту проблему, мы можем захватить значение параметра M на момент времени Lambda, что он использует в качестве Aboulet Arcome: &&? 're', 'mi'): funclist.append (lambda m = m: callback (m))
теперь, в каждой функции Lambda, m захватывается в качестве локальной переменной, и его значение сохраняется, когда цикл завершается. Следовательно, когда выполняются функции обратного вызова, они печатают правильные значения, что приводит к ожидаемому выводу.
]Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3