"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como evitar comportamentos inesperados no escopo da função Lambda e parâmetros em loops?

Como evitar comportamentos inesperados no escopo da função Lambda e parâmetros em loops?

Postado em 2025-03-24
Navegar:655

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

escopo das funções lambda e seus parâmetros

lambda funções, introduzidas em Python como funções anônimas concisas, oferecem conveniência em vários cenários. No entanto, entender seu escopo de parâmetro pode ser crucial para evitar comportamentos inesperados. Vamos explorar uma questão comum que surge ao usar as funções lambda dentro de loops. Imprima msg # Abordagem incorreta usando um iterador FUNCLIST = [] para m em ('do', 're', 'mi'): FUNCLIST.APPEND (Lambda: Retorno de chamada (M)) # Abordagem correta, criando uma de cada vez FUNCLIST = [] FUNCLIST.APPEND (Lambda: retorno de chamada ('Do')) FUNCLIST.APPEND (Lambda: retorno de chamada ('re')) FUNCLIST.APPEND (Lambda: Retorno de chamada ('Mi')) # Execute as funções de retorno de chamada Para F em FunClist: f ()

Quando executado, o código imprime inesperadamente: mi mi mi fazer ré mi

em vez da saída esperada:

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()

The Explication
mi
mi
mi
do
re
mi

Entendendo o escopo das funções lambda e seus parâmetros é crucial aqui. Ao contrário das funções regulares, as funções Lambda fazem referência ao ambiente circundante em que são criadas. Esta referência inclui variáveis ​​usadas no corpo do lambda. No entanto, após a conclusão do loop, a variável M faz referência o último elemento no loop, isto é, 'mi'. Portanto, quando as funções de retorno de chamada são executadas, todas elas imprimem 'mi' usando a referência atualizada. ('do', 're', 'mi'): FUNCLIST.APNEND (Lambda M = M: Retorno de chamada (M))

do
re
mi
do
re
mi
Declaração de lançamento Este artigo é reproduzido em: 1729329977 Se houver alguma violação, entre em contato com [email protected] para excluí -lo.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3