Comment capturer des variables locales dans les fermetures lambda au sein de boucles ?

DDD
Libérer: 2024-11-10 12:52:03
original
263 Les gens l'ont consulté

How do you capture local variables in lambda closures within loops?

Fermetures Lambda et portées variables dans les boucles

Lors de la définition de lambdas dans des boucles, il est important de comprendre comment fonctionnent les portées variables. Dans l'extrait de code fourni, chaque lambda créé à l'intérieur de la boucle fait référence à la même variable obj, qui est modifiée à chaque itération.

Résolution de portée par défaut

Par défaut, un lambda capturera les variables de la portée englobante. Dans le code donné, la portée englobante est le bloc de boucle. Ainsi, chaque lambda capture efficacement la dernière valeur de obj. Ce comportement peut conduire à des résultats incorrects lors de l'appel des lambdas à partir d'une portée différente, car ils peuvent ne pas avoir la valeur attendue.

Capturez les variables locales

Pour résoudre ce problème , vous devez forcer le lambda à capturer la valeur actuelle de obj. Ceci peut être réalisé en introduisant une nouvelle variable locale dans le lambda qui est liée à obj au moment de la création. L'extrait de code suivant illustre cette approche :

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda obj=obj: obj.some_var)
Copier après la connexion

En passant explicitement obj comme argument au lambda, nous créons une nouvelle variable locale pour chaque lambda. Cela garantit que chaque lambda capture la valeur locale de obj à partir de l'itération de la boucle. Par conséquent, lorsque vous appellerez les lambdas depuis un autre scope, ils accéderont à la valeur correcte.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal