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
Susan Sarandonoriginal
2024-12-21 07:52:10423parcourir

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

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)

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)

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!

Déclaration:
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