Maison >développement back-end >Tutoriel Python >Pourquoi Python Lambdas se lie-t-il aux valeurs des variables locales, pas aux références ?

Pourquoi Python Lambdas se lie-t-il aux valeurs des variables locales, pas aux références ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-28 06:37:021115parcourir

 Why do Python Lambdas Bind to Local Variables' Values, Not References?

Fonctions Python Lambda et liaison de variables locales

Lorsque vous travaillez avec des fonctions Python lambda, il est important de comprendre leur comportement concernant les références aux variables locales dans la portée qu'ils sont définis. Le code suivant illustre ce problème :

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

x = []
for v in range(2):
    x.append(lambda: pv(v))

for xx in x:
    xx()</code>

Dans ce scénario, nous nous attendrions à voir 0 et 1 imprimés sur la console. Cependant, la sortie réelle imprime 1 deux fois. Ce comportement découle de la façon dont les lambdas Python se lient aux variables locales.

The Gotcha : Early Binding

Les lambdas Python ne se lient pas à la référence des variables locales lorsqu'elles sont créés. Au lieu de cela, ils se lient à la valeur de la variable à ce moment précis. Par conséquent, lorsque le lambda est invoqué, il accède à la valeur actuelle de la variable, et non à la valeur qui était disponible au moment de la création.

Une solution : liaison tardive avec des arguments par défaut

Pour lier une variable locale à une fonction lambda et conserver sa référence correcte, nous pouvons utiliser la liaison tardive. Ceci est réalisé en passant un argument par défaut à la fonction lambda, comme indiqué ci-dessous :

<code class="python">x.append(lambda v=v: pv(v))</code>

Avec ce changement, le lambda se liera à la valeur de v lorsque le lambda est créé, et non lorsqu'il est invoqué. Par conséquent, lorsque nous parcourons la liste x et appelons chaque fonction lambda, nous obtiendrons le résultat attendu de 0 et 1.

Comprendre la liaison précoce

Pour aller plus loin Pour clarifier ce concept, considérons l'exemple suivant :

<code class="python">x = "before foo defined"
def foo():
    print(x)
x = "after foo was defined"
foo()</code>

Cet extrait de code s'imprime "après la définition de foo" sur la console, démontrant que les variables sont liées au moment de l'appel de fonction, pas de la création.

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
Article précédent:semaine cs ythonArticle suivant:semaine cs ython