Maison >développement back-end >Tutoriel Python >Pourquoi les fonctions Lambda dans les boucles Python ne parviennent-elles parfois pas à se lier correctement ?

Pourquoi les fonctions Lambda dans les boucles Python ne parviennent-elles parfois pas à se lier correctement ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-26 19:43:22475parcourir

Why Do Lambda Functions in Python Loops Sometimes Fail to Bind Properly?

Fonctions Lambda dans les boucles

En Python, les fonctions lambda fournissent un moyen concis de définir des fonctions anonymes. Cependant, lorsqu'ils sont utilisés dans des boucles, ils peuvent entraîner un comportement inattendu si une liaison appropriée n'est pas assurée.

Considérez l'extrait de code suivant :

directorys = {'login': <object>, 'home': <object>}
for d in directorys:
    self.command["cd " + d] = (lambda : self.root.change_directory(d))

L'intention est de créer une commande de mappage de dictionnaire. chaînes aux fonctions qui changent le répertoire. Cependant, le résultat est inattendu : les deux fonctions lambda créées sont identiques et exécutent la même commande, en changeant le répertoire en "login".

Pourquoi cela se produit-il ?

Les fonctions Lambda au sein d'une boucle partagent la même portée de fonction. Cela signifie que la variable capturée par la fonction lambda est la même pour toutes les itérations de la boucle. Dans ce cas, « d » représente la valeur du dernier élément du dictionnaire « répertoires », qui est « connexion ».

Résoudre le problème

Pour garantir liaison appropriée, nous devons nous assurer que chaque fonction lambda a accès à sa propre valeur unique de « d ». Une approche consiste à passer "d" comme paramètre avec une valeur par défaut :

lambda d=d: self.root.change_directory(d)

En définissant la valeur par défaut de "d" sur la valeur actuelle de "d" à chaque itération de la boucle, nous créez une fermeture unique pour chaque fonction lambda. Alternativement, nous pouvons utiliser des techniques de fermeture supplémentaires pour obtenir le même résultat :

(lambda d=d: lambda: self.root.change_directory(d))()

Cette fonction lambda externe crée une fermeture pour "d" et la fonction lambda interne utilise "d" de la fermeture.

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