Maison  >  Article  >  développement back-end  >  Pourquoi les fonctions Lambda dans les boucles capturent-elles la valeur de l'index final au lieu de la valeur d'itération de la boucle ?

Pourquoi les fonctions Lambda dans les boucles capturent-elles la valeur de l'index final au lieu de la valeur d'itération de la boucle ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 22:44:30925parcourir

Why Do Lambda Functions in Loops Capture the Final Index Value Instead of the Loop Iteration Value?

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!

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