Comprendre la fermeture dans les fonctions Python Lambda
Question originale : Puzzle de fermeture Lambda avec impression d'index
En programmation, une fermeture fait référence à une fonction interne qui capture les variables de sa fonction englobante même après le retour de la fonction englobante. Cela permet à la fonction interne de conserver l'accès aux variables, les rendant persistantes pendant toute la durée de vie de la fermeture.
Un cas d'utilisation courant des expressions lambda consiste à lier une variable à une fonction. Cependant, si elles sont utilisées dans une boucle, comme dans l'exemple de code fourni, les fonctions lambda peuvent présenter un comportement inattendu en raison de la fermeture.
Explication du code
Dans le code donné, cinq boutons sont créés dans une boucle. Chaque bouton se voit attribuer une fonction lambda qui appelle la fonction makeId() et imprime l'index i. Cependant, lorsque l'utilisateur clique sur un bouton, la fonction makeId() imprime toujours 5, qui est la valeur finale de i dans la boucle.
Problème et solution
Ce problème se pose car lorsque l'expression lambda est exécutée, elle résout la variable i à sa valeur à ce moment-là. Puisque la boucle est déjà terminée, i est résolu à sa valeur finale, qui est 5.
Pour résoudre ce problème, l'expression lambda doit être modifiée pour spécifier explicitement la valeur correcte de i à l'aide d'un paramètre lambda. . Par défaut, les lambdas utilisent les variables de la portée englobante, mais la spécification d'un paramètre garantit qu'une variable locale avec la valeur souhaitée est créée dans le lambda :
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
Avec cette modification, la fonction lambda de chaque bouton capture la valeur correcte de i de la boucle, et la fonction makeId() peut imprimer correctement l'index prévu.
Remarque supplémentaire
Le paramètre lambda n'a pas besoin d'avoir le même name comme variable englobante. Il peut avoir n'importe quel nom, garantissant que la valeur correcte est capturée dans la portée du lambda.
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!