Comment les fonctions Python Lambda gèrent-elles les références de variables locales et quand sont-elles évaluées ?

Linda Hamilton
Libérer: 2024-10-27 04:06:02
original
426 Les gens l'ont consulté

How do Python Lambda Functions Handle Local Variable References and When Do They Get Evaluated?

Comprendre la liaison Python Lambda avec des valeurs locales

Lorsque vous travaillez avec des fonctions lambda en Python, il est important de comprendre comment elles interagissent avec les variables locales, surtout lorsque plusieurs lambdas font référence à la même variable.

Considérons l'exemple suivant :

<code class="python">def pv(v):
    print(v)

x = []
for v in range(2):
    x.append(lambda: pv(v))  # Lambda binds to the reference of 'v'

for xx in x:
    xx()  # Prints 1 twice</code>
Copier après la connexion

Au départ, vous pouvez vous attendre à ce que les fonctions lambda de la liste « x » fassent référence au « v » actuel. au moment de leur création. Cependant, ce n’est pas ainsi que fonctionne Python. Au lieu de cela, Python évalue le nom de la variable au moment de l'appel de la fonction, ce qui conduit les deux lambdas à référencer la valeur finale de « v » (qui est 1).

Pour obtenir le comportement souhaité (imprimer 0 puis 1). ), vous pouvez utiliser le mécanisme d'argument par défaut de Python :

<code class="python">def pv(v):
    print(v)

x = []
for v in range(2):
    x.append(lambda v=v: pv(v))  # Lambda binds to the copy of 'v' at creation time

for xx in x:
    xx()  # Prints 0 and then 1</code>
Copier après la connexion

En définissant un argument par défaut pour 'v', les fonctions lambda sont liées à une copie locale de 'v' créée au moment de leur création, en s'assurant qu'ils conservent les références correctes lorsqu'ils sont utilisés ultérieurement.

N'oubliez pas que Python recherche les noms de variables au moment de l'appel de la fonction, et non au moment de la création. Ce principe s'applique non seulement aux lambdas mais aussi aux fonctions régulières, comme le démontre l'exemple suivant :

<code class="python">x = "before foo defined"

def foo():
    print(x)  # Prints "after foo was defined"

x = "after foo was defined"
foo()</code>
Copier après la connexion

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!