Maison >développement back-end >Tutoriel Python >Pourquoi la commande de mon bouton imprime-t-elle toujours le même index dans une boucle avec un Lambda ?

Pourquoi la commande de mon bouton imprime-t-elle toujours le même index dans une boucle avec un Lambda ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 03:54:27910parcourir

 Why Does My Button's Command Always Print the Same Index in a Loop with a Lambda?

Comprendre la fermeture dans un Lambda : résoudre les variables

Dans cette situation, vous essayez de créer plusieurs boutons dans une boucle, avec chacun bouton déclenchant une commande qui imprime une valeur d’index spécifique. Cependant, vous rencontrez un problème où la commande du bouton imprime toujours le même index, "5".

Ce comportement découle de la nature des fermetures dans les lambdas. Lorsqu'un lambda est défini, il capture les variables de la portée englobante et les référence lors de son exécution. Dans votre cas, la portée englobante est la boucle, où la variable i représente l'index actuel.

Malheureusement, lorsque le lambda est exécuté (lorsque le bouton est enfoncé), la valeur de i a déjà atteint la dernière itération et est égal à "5" pour tous les boutons. En effet, la variable capturée i est une référence au même emplacement mémoire et la valeur qu'elle contient est mise à jour au fur et à mesure de la progression de la boucle.

Pour résoudre ce problème, vous devez créer une fermeture qui capture la valeur correcte. de moi pour chaque bouton. Vous pouvez le faire en fournissant une valeur par défaut pour le paramètre i dans la fonction lambda. Par exemple :

<code class="python">make_button = Tkinter.Button(frame, text="make!",
                              command=lambda i=i: makeId(i))</code>

En fournissant i=i comme valeur par défaut pour le paramètre lambda, vous créez une variable locale i qui contient la valeur d'index correcte pour chaque bouton. Lorsque vous appuyez sur le bouton, la fonction lambda s'exécutera avec la variable locale capturée i et l'index correct sera imprimé.

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