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
Libérer: 2024-12-26 19:43:22
original
473 Les gens l'ont consulté

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))
Copier après la connexion

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)
Copier après la connexion

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))()
Copier après la connexion

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!

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