Maison > développement back-end > Tutoriel Python > Pourquoi les fonctions Python Lambda capturent-elles la valeur finale d'une variable de boucle et comment cela peut-il être corrigé ?

Pourquoi les fonctions Python Lambda capturent-elles la valeur finale d'une variable de boucle et comment cela peut-il être corrigé ?

Susan Sarandon
Libérer: 2024-12-20 03:26:09
original
438 Les gens l'ont consulté

Why Do Python Lambda Functions Capture the Final Value of a Loop Variable, and How Can This Be Fixed?

Comprendre la capture de fermeture dans les fonctions Lambda

Les fonctions Lambda, un outil concis et pratique en programmation, permettent des fonctions anonymes stockées dans les fermetures. En Python, les fermetures capturent la portée englobante pour accéder aux variables externes, mais ce comportement peut parfois être surprenant.

Considérons un scénario dans lequel un ensemble de fonctions lambda sont initialisées dans une boucle pour ajouter un nombre spécifique à leur contribution. Intuitivement, on pourrait s'attendre à ce que ces fonctions conservent la valeur de la variable de boucle au moment de leur création. Cependant, le résultat réel est différent : toutes les fonctions lambda capturent la valeur finale de la variable de boucle.

Cela se produit parce que les fermetures en Python capturent la portée englobante, et non les références à des variables ou des objets spécifiques. En d'autres termes, les fonctions lambda intègrent effectivement une référence à la variable de boucle i, qui change à mesure que la boucle progresse. Par conséquent, lorsque l'une de ces fonctions est appelée, elle utilise la valeur finale de i, ce qui entraîne des résultats inattendus.

Application de la capture de valeur dans les fonctions Lambda

Pour contourner ce problème émettre et capturer la valeur souhaitée de la variable de boucle, il est nécessaire de forcer la capture à l'aide d'un paramètre avec une valeur par défaut. En attribuant la variable à un paramètre dans la fonction lambda et en fournissant une valeur par défaut de sa valeur prévue, il est possible de conserver le comportement de capture souhaité.

Exemple :

# Initialize an array of lambda functions
adders = [None, None, None, None]

# Create lambda functions with forced capture of i
for i in [0, 1, 2, 3]:
    adders[i] = lambda a, i=i: i + a

# Call a lambda function with input
print(adders[1](3))  # Output: 4
Copier après la connexion

Conclusion

En comprenant le mécanisme de capture dans les fonctions lambda et en utilisant cette technique, il est possible de contrôler les valeurs capturées par les fermetures, garantissant le comportement souhaité dans l'exécution du code.

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