Comprendre les captures de fermeture dans les fonctions Lambda
Les fermetures Python capturent l'état de la portée englobante où elles sont définies. Plus précisément, elles capturent les valeurs des variables référencées dans la fonction lambda qui ne sont pas présentes dans sa portée.
Dans l'exemple fourni, les fonctions lambda capturent la variable i, à laquelle différentes valeurs sont attribuées au fur et à mesure de l'exécution de la boucle. Cependant, les fonctions lambda ne capturent pas de référence à l'objet pointé par i. Au lieu de cela, ils capturent la valeur de i au moment de leur création.
Ce comportement explique le résultat inattendu de 6 lors de l'appel des additionneurs[1](3). Malgré l'attente d'une référence à l'objet entier, la fonction lambda capture la valeur 3, qui est la valeur finale attribuée à i.
Pour obtenir le comportement souhaité consistant à préserver la valeur actuelle de i dans chaque fonction lambda , une technique appelée arguments par défaut peut être utilisée. En fournissant un argument par défaut à la fonction lambda, la valeur de i au moment de la création est verrouillée. Par exemple :
for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i+a
Dans ce cas, le paramètre i a une valeur par défaut définie sur la valeur actuelle valeur de i. Lorsque la fonction lambda est invoquée, elle utilise la valeur de i qui a été capturée lors de sa création.
Cette méthode garantit que chaque fonction lambda du tableau des additionneurs capture la valeur prévue de i, leur permettant de produire l'effet attendu. sortie lorsqu'il est invoqué.
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!