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!