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!