Maison >développement back-end >Tutoriel Python >Pourquoi ma fonction Lambda imprime-t-elle toujours « 5 » ? Un guide pour capturer des variables en Python.

Pourquoi ma fonction Lambda imprime-t-elle toujours « 5 » ? Un guide pour capturer des variables en Python.

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 17:26:03468parcourir

Why Does My Lambda Function Always Print

Capture de variables dans les fonctions Lambda : fermeture

Dans les fonctions lambda, la capture de variables à partir de la portée englobante est un problème courant. Une fonction lambda, par défaut, fait référence aux variables dans sa portée englobante. Cependant, la résolution de ces références se produit au moment de l'exécution, pas pendant la définition.

Considérez cet extrait de code, où nous créons cinq boutons à l'aide d'une boucle et lions une commande à chaque bouton pour imprimer son index à l'aide d'un Fonction lambda :

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

Vous pouvez vous attendre à ce que ce code imprime l'index du bouton sur lequel vous avez cliqué. Cependant, il affiche toujours "5" car la valeur de i est capturée au moment où la boucle se termine, c'est-à-dire après que i ait été incrémenté à 5.

Solution : Utiliser une fermeture

Pour résoudre ce problème, nous pouvons utiliser une fermeture. Une fermeture est une fonction qui capture les variables de sa portée englobante et les initialise lorsqu'elle est définie. Cela nous permet de capturer la valeur correcte de i pour chaque bouton.

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

En attribuant i=i dans la fonction lambda, nous créons une variable locale qui est initialisée avec la valeur actuelle de i de la boucle . Cela garantit que chaque bouton a sa propre référence à son index prévu.

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