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
Libérer: 2024-11-16 14:31:03
original
661 Les gens l'ont consulté

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())
Copier après la connexion

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())
Copier après la connexion

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!

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