Maison >développement back-end >Tutoriel Python >Pourquoi les fonctions Lambda dans les boucles Python For capturent-elles uniquement la dernière valeur ?

Pourquoi les fonctions Lambda dans les boucles Python For capturent-elles uniquement la dernière valeur ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-06 02:29:10448parcourir

Why Do Lambda Functions in Python For Loops Only Capture the Last Value?

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

Lors de l'utilisation de fonctions lambda dans une boucle for, la valeur capturée par le lambda peut ne pas être celle prévue. Ce problème survient en raison du fonctionnement du garbage collection de Python, qui entraîne la conservation de seule la dernière valeur de la variable.

Pour illustrer ce concept :

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

Dans ce code, chaque fonction lambda devrait capturer une valeur unique d'option, mais tout se comportera comme si l'option était définie sur "DEBUG", la valeur finale qu'elle prend dans la boucle.

Pour résoudre ce problème, comme suggéré dans la solution, chaque fonction lambda doit capturer sa propre variable. Ceci peut être réalisé en attribuant une nouvelle variable locale à l'option, comme suit :

for i in range(len(options)):
    opt = options[i]  # Assign a new variable to capture the unique value
    __cMenu.add_command(
        label="{}".format(opt),
        command=lambda: self.filter_records(column, opt)
    )

Alternativement, les expressions lambda peuvent être réécrites comme suit :

lambda opt=option: self.filter_records(column, opt)  # Differentiate loop variable and function parameter

En capturant les valeurs appropriées, Les fonctions lambda peuvent fonctionner indépendamment au sein d'une boucle, permettant d'obtenir le comportement souhaité.

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