Maison > développement back-end > Tutoriel Python > Pourquoi mes Lambdas dans une boucle For utilisent-ils uniquement la dernière valeur ?

Pourquoi mes Lambdas dans une boucle For utilisent-ils uniquement la dernière valeur ?

Mary-Kate Olsen
Libérer: 2024-12-18 06:17:10
original
215 Les gens l'ont consulté

Why Do My Lambdas in a For Loop Only Use the Last Value?

Lambda dans la boucle For ne prend que la dernière valeur

Dans le code suivant :

options=["INFO", "WARNING", "DEBUG"]

for i in range(len(options)):
    option=options[i]
    __cMenu.add_command(
        label="{}".format(option), 
        command=lambda: self.filter_records(column, option)
   )
Copier après la connexion

plusieurs lambdas sont créés et enregistrés. Ces lambdas doivent capturer différentes valeurs de l'option de variable locale. Cependant, lorsque ces lambdas sont utilisés, ils se comportent tous comme si l'option était définie sur "DEBUG", la dernière valeur qu'elle prend dans la boucle.

Ce problème survient en raison du timing d'évaluation des noms dans les corps de fonction. . Dans le code fourni, les noms sont évalués lors de l'exécution de la fonction. De ce fait, les lambdas créés dans la boucle font tous référence à la même valeur d'option au moment de l'exécution, qui est "DEBUG".

Pour contourner ce problème, la modification suivante peut être apportée :

__cMenu.add_command(label="{}".format(option),
    command=lambda opt=option: self.filter_records(column, opt))
Copier après la connexion

En introduisant option=option comme argument de la fonction lambda, chaque lambda capture la valeur correcte de l'option au moment de la création, plutôt que de se fier à la valeur à ce moment-là. d'exécution. Cela garantit que chaque lambda fonctionne sur la valeur d'option souhaitée.

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