Maison > développement back-end > Tutoriel Python > Pourquoi les fonctions Lambda dans les boucles capturent-elles la dernière valeur au lieu de la valeur de chaque itération ?

Pourquoi les fonctions Lambda dans les boucles capturent-elles la dernière valeur au lieu de la valeur de chaque itération ?

Susan Sarandon
Libérer: 2024-12-21 07:52:10
original
374 Les gens l'ont consulté

Why Do Lambda Functions in Loops Capture the Last Value Instead of Each Iteration's Value?

Lambda in a Loop

Considérez l'extrait de code suivant :

# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
    self.command["cd " + d] = (lambda : self.root.change_directory(d))
Copier après la connexion

Le but est de créer un dictionnaire de deux fonctions avec des clés" cd login" et "cd home". Cependant, le résultat montre que les deux fonctions lambda ont le même contenu avec la clé "cd login".

Pour comprendre ce comportement inattendu, il est important de considérer comment les fonctions lambda fonctionnent dans les boucles imbriquées. Lorsqu'une fonction lambda est définie dans une boucle, elle capture les variables de la portée environnante. Dans ce cas, la variable d de la boucle est capturée par chaque fonction lambda.

Cependant, les fonctions lambda sont exécutées paresseusement. Ainsi, lorsque vous accédez au dictionnaire self.command en dehors de la boucle, toutes les fonctions lambda ont capturé la même variable d, qui est la dernière valeur de d dans la boucle. Par conséquent, toutes les fonctions pointent vers la même méthode, ce qui entraîne le comportement observé.

Pour résoudre ce problème, nous devons nous assurer que chaque fonction lambda capture une valeur distincte de d. Une solution consiste à passer d comme paramètre à la fonction lambda et à fournir une valeur par défaut :

lambda d=d: self.root.change_directory(d)
Copier après la connexion

Maintenant, le d à l'intérieur de la fonction lambda utilise le paramètre, même s'il porte le même nom. La valeur par défaut de ce paramètre est évaluée lors de la création de la fonction, en la liant à la valeur correcte de d pour chaque itération de la boucle.

Alternativement, nous pouvons utiliser des fermetures imbriquées pour obtenir le même résultat :

(lambda d: lambda: self.root.change_directory(d))(d)
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal