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