"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment capturer correctement les variables dans les fonctions Lambda dans les boucles ?

Comment capturer correctement les variables dans les fonctions Lambda dans les boucles ?

Publié le 2024-11-07
Parcourir:182

How to Properly Capture Variables in Lambda Functions in Loops?

Capture de variables dans les fonctions Lambda

Lors de l'utilisation de fonctions lambda dans une boucle, il est important de comprendre la portée de leurs variables. Contrairement aux fonctions normales qui copient les variables locales, les fonctions lambda y font référence.

Considérez le code donné :

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

Ici, la fonction lambda capture la valeur de m à partir de la portée englobante. Cependant, une fois la boucle terminée, m conserve la dernière valeur (« mi »). Lorsque chaque fonction lambda est appelée, elle fait référence à cette variable m partagée, ce qui entraîne la sortie « mi » plusieurs fois.

Pour surmonter ce problème et garantir que chaque lambda capture une valeur distincte de m, utilisez une technique appelée " arguments par défaut":

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

En faisant de m un paramètre par défaut portant le même nom, chaque lambda capture sa propre instance de la variable, garantissant le résultat attendu :

"faire"
"re"
"mi"

Déclaration de sortie Cet article est réimprimé à l'adresse : 1729329734. En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3