Maison > développement back-end > Tutoriel Python > Quelles variables les fermetures de fonctions Python Lambda capturent-elles réellement ?

Quelles variables les fermetures de fonctions Python Lambda capturent-elles réellement ?

DDD
Libérer: 2024-12-29 06:55:14
original
353 Les gens l'ont consulté

What Variables Do Python Lambda Function Closures Actually Capture?

Que capturent les fermetures de fonctions Python Lambda ?

Lorsque vous travaillez avec des fermetures de fonctions Python lambda, il est important de comprendre leur comportement de capture. Une fermeture capture les valeurs des variables de sa portée englobante qui sont utilisées dans la fermeture. Cependant, la manière dont cette capture se produit peut être surprenante.

Pour illustrer cela, considérons le code suivant :

adders = [None, None, None, None]

for i in [0, 1, 2, 3]:
    adders[i] = lambda a: i + a

print(adders[1](3))
Copier après la connexion

Dans ce code, nous créons une liste de fonctions lambda qui prennent une seule entrée et ajoutez-y une valeur constante. La valeur constante est initialement définie sur la valeur de i lors de la création de la fonction. Cependant, lorsque nous inspectons la liste des fermetures, nous constatons étonnamment qu'elles font toutes référence à la valeur finale de i, ce qui donne un résultat inattendu de 6.

Ce comportement résulte du fait que les fermetures capturent la valeur du variable plutôt que sa référence. Par conséquent, lorsque la valeur de i change après la création de la fermeture, la fermeture continue de faire référence à la dernière valeur capturée.

Capturer la valeur actuelle

Pour capturer la valeur actuelle valeur actuelle de i, nous pouvons utiliser une astuce connue sous le nom de technique des « paramètres factices ». En déclarant un paramètre portant le même nom que la variable que nous voulons capturer et en lui fournissant une valeur par défaut de cette variable, nous forçons la fermeture pour capturer la valeur actuelle.

for i in [0, 1, 2, 3]:
    adders[i] = lambda a, i=i: i + a  # <-- Note the dummy parameter with a default value

print(adders[1](3))  # Output: 4
Copier après la connexion

Avec cette technique, le La fermeture capturera la valeur de i au moment de sa création, garantissant que les modifications apportées à i par la suite n'affecteront pas le comportement de la fermeture.

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