«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как избежать неожиданного поведения в области функции Lambda и параметров в циклах?

Как избежать неожиданного поведения в области функции Lambda и параметров в циклах?

Опубликовано в 2025-03-24
Просматривать:528

How to Avoid Unexpected Behavior in Lambda Function Scope and Parameters in Loops?

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 захватывается в качестве локальной переменной, и его значение сохраняется, когда цикл завершается. Следовательно, когда выполняются функции обратного вызова, они печатают правильные значения, что приводит к ожидаемому выводу.

]
Заявление о выпуске Эта статья воспроизведена: 1729329977, если есть какие -либо нарушения, пожалуйста, свяжитесь с учебным заведением[email protected], чтобы удалить его.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3