"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 resultados inesperados de modificações de parâmetros em funções Lambda

Como evitar resultados inesperados de modificações de parâmetros em funções Lambda

Publicado em 2024-11-18
Navegar:673

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

Escopo das funções Lambda e seus parâmetros

As funções Lambda são funções anônimas que podem capturar o escopo de sua função envolvente. Isso permite que eles acessem variáveis ​​e parâmetros do escopo pai. No entanto, esse comportamento às vezes pode levar a resultados inesperados quando funções lambda usam parâmetros modificados dentro da função envolvente.

Para ilustrar o problema, considere o seguinte código:

def callback(msg):
    print(msg)

# Creating a list of function handles with an iterator
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))

# Calling the lambda functions
for f in funcList:
    f()

A saída esperada deste código é:

do
re
mi

No entanto, a saída real é:

mi
mi
mi

Isso ocorre porque as funções lambda capturam uma referência à variável m do escopo envolvente. Quando o iterador executa o loop, ele atribui o valor 'mi' a m na iteração final. Como resultado, todas as funções lambda têm uma referência a 'mi' quando são executadas, mesmo que valores diferentes tenham sido passados ​​para elas durante a criação.

Para resolver esse problema, você pode capturar o valor de m em o tempo de criação da função lambda usando-a como o valor padrão de um parâmetro opcional:

for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))

Isso garante que cada função lambda tenha acesso à sua própria cópia de m, capturando o valor que foi atribuído durante a iteração do loop. A saída deste código será:

do
re
mi
Declaração de lançamento Este artigo foi reimpresso em: 1729329919 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