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
Libérer: 2024-10-26 22:44:30
original
923 Les gens l'ont consulté

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

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!