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
Mary-Kate Olsenoriginal
2024-12-18 06:17:10300parcourir

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)
   )

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))

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!

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