Pourquoi les fermetures Lambda capturent-elles des noms plutôt que des valeurs ?

DDD
Libérer: 2024-10-21 13:15:30
original
783 Les gens l'ont consulté

Why Do Lambda Closures Capture Names Instead of Values?

Portée des fermetures Python Lambda

Lorsque vous essayez d'utiliser des fermetures pour supprimer une variable de la signature d'une fonction, vous pouvez rencontrer un comportement inattendu. Plus précisément, une fonction lambda non incluse dans une autre fonction renvoie la dernière valeur de la variable pour toutes les instances.

Pour comprendre ce comportement, il est crucial de reconnaître que les fermetures capturent des noms, pas des valeurs. Lorsque vous définissez un lambda comme lambda x : test_fun(n, x), la variable n n'est pas évaluée au sein de la fonction mais plutôt au moment de l'appel. Par conséquent, la valeur qu'elle prend est la dernière valeur de la boucle.

Pour "éliminer" efficacement une variable à l'aide de fermetures, la variable doit être passée en argument à la fonction. Cela attribue la valeur actuelle de la variable à la fonction et la « verrouille » efficacement. Par exemple :

<code class="python">stuff = [lambda x: n+x for n in [1, 2, 3]]  # Bad, captured value is last value
stuff = [lambda x, n=n: n+x for n in [1, 2, 3]]  # Good, n is locked in</code>
Copier après la connexion

Alternativement, vous pouvez utiliser deux fonctions imbriquées :

<code class="python">def makeFunc(n):
    return lambda x: x+n

stuff = [makeFunc(n) for n in [1, 2, 3]]</code>
Copier après la connexion

Ici, le lambda dans makeFunc capture la variable n locale plutôt que la variable globale. Chaque appel makeFunc crée une nouvelle variable locale, garantissant que les fonctions lambda renvoyées ont des valeurs n uniques.

En fin de compte, le choix entre simplicité et flexibilité vous appartient. Vous pouvez opter pour une création de fonction plus simple avec un argument supplémentaire dans la fonction renvoyée ou des fonctions plus propres avec un processus de création de fonction plus complexe impliquant deux fonctions imbriquées.

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