"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 les résultats inattendus des modifications de paramètres dans les fonctions Lambda

Comment éviter les résultats inattendus des modifications de paramètres dans les fonctions Lambda

Publié le 2024-11-18
Parcourir:491

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

Portée des fonctions Lambda et de leurs paramètres

Les fonctions Lambda sont des fonctions anonymes qui peuvent capturer la portée de leur fonction englobante. Cela leur permet d'accéder aux variables et aux paramètres de la portée parent. Cependant, ce comportement peut parfois conduire à des résultats inattendus lorsque les fonctions lambda utilisent des paramètres modifiés dans la fonction englobante.

Pour illustrer le problème, considérons le code suivant :

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

La sortie attendue de ce code est :

do
re
mi

Cependant, la sortie réelle est :

mi
mi
mi

Cela est dû au fait que les fonctions lambda capturent une référence à la variable m à partir de la portée englobante. Lorsque l'itérateur exécute la boucle, il attribue la valeur « mi » à m lors de l'itération finale. Par conséquent, toutes les fonctions lambda ont une référence à « mi » lorsqu'elles sont exécutées, même si différentes valeurs leur ont été transmises lors de la création.

Pour résoudre ce problème, vous pouvez capturer la valeur de m à l'heure de création de la fonction lambda en l'utilisant comme valeur par défaut d'un paramètre facultatif :

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

Cela garantit que chaque fonction lambda a accès à sa propre copie de m, capturant la valeur qui a été attribuée lors de l'itération de la boucle. La sortie de ce code sera :

do
re
mi
Déclaration de sortie Cet article est réimprimé à l'adresse : 1729329919. 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