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