Maison  >  Article  >  développement back-end  >  Comment les fonctions Python Lambda gèrent-elles les références de variables locales et quand sont-elles évaluées ?

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 04:06:02428parcourir

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>

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>

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>

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!

Déclaration:
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