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