Maison >développement back-end >Tutoriel Python >Pourquoi Python Lambdas se lie-t-il aux valeurs des variables locales, pas aux références ?
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!