"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 éviter le comportement inattendu dans la portée de la fonction lambda et les paramètres dans les boucles?

Comment éviter le comportement inattendu dans la portée de la fonction lambda et les paramètres dans les boucles?

Publié le 2025-03-24
Parcourir:152

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

SPOCE OF LAMBDA Functions et leurs paramètres

Lambda Fonctions, introduit dans Python en tant que fonctions anonymes concises, offrent une commodité dans divers scénarios. Cependant, la compréhension de leur portée des paramètres peut être cruciale pour éviter un comportement inattendu. Explorons un problème commun qui se pose lors de l'utilisation de fonctions lambda dans des boucles.

Le problème

Considérons le code suivant, qui vise à créer une liste de fonctions de rappel pour les événements GUI:

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

Lorsqu'il est exécuté, le code imprime de façon inattendue:

mi
mi
mi
do
re
mi

au lieu de la sortie attendue:

do
re
mi
do
re
mi

L'explication

Comprendre la portée des fonctions lambda et leurs paramètres est crucial ici. Contrairement aux fonctions régulières, les fonctions lambda font référence à l'environnement environnant dans lequel elles sont créées. Cette référence comprend des variables utilisées dans le corps de Lambda.

Lors de l'utilisation d'un itérateur dans l'approche incorrecte, pour chaque élément m dans la boucle, il crée une nouvelle fonction lambda qui fait référence à la même variable m. Cependant, une fois la boucle terminée, la variable M fait référence au dernier élément de la boucle, c'est-à-dire «mi». Therefore, when the callback functions are executed, they all print 'mi' using the updated reference.

The Solution

To resolve this issue, we can capture the value of the parameter m at the time the lambda function is created by using it as the default argument of an optional parameter:

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

Maintenant, dans chaque fonction lambda, m est capturé en tant que variable locale, et sa valeur est conservée à la fin de la boucle. Par conséquent, lorsque les fonctions de rappel sont exécutées, elles impriment les valeurs correctes, ce qui entraîne la sortie attendue.

Déclaration de sortie Cet article est reproduit sur: 1729329977 S'il y a une contrefaçon, 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