Maison >développement back-end >Tutoriel Python >Comment éviter la fermeture de variables lors de la création de boucles internes Lambdas ?

Comment éviter la fermeture de variables lors de la création de boucles internes Lambdas ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-16 14:31:03645parcourir

How to Avoid Variable Closure When Creating Lambdas Inside Loops?

Création de lambdas dans une boucle sans fermeture de variable

Lors de la création de lambdas dans une boucle qui parcourent une liste d'objets, il est important de empêcher la fermeture variable. La fermeture d'une variable se produit lorsqu'une fonction conserve l'accès à une variable en dehors de sa portée immédiate. Cela peut conduire à un comportement inattendu, comme tous les lambdas faisant référence à la même valeur finale d'une variable.

Le problème :

Le code suivant illustre le problème :

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda: obj.some_var)

for f in lambdas_list:
    print(f())

Lors de l'appel des lambdas dans ce code, tous les lambdas produiront le même résultat : la valeur de obj.some_var du dernier objet de obj_list. En effet, les lambdas font tous référence à la même variable obj, qui change à chaque itération de la boucle.

La solution :

Pour éviter la fermeture de la variable, nous pouvons utilisez la syntaxe lambda x=x : où x est la variable que nous voulons capturer. Cela capture une copie d'obj et la rend locale à chaque lambda :

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda obj=obj: obj.some_var)

for f in lambdas_list:
    print(f())

Maintenant, chaque lambda fera référence au bon obj et produira la valeur attendue pour obj.some_var.

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