Pourquoi la portée des fonctions Lambda a-t-elle un impact sur leur sortie en Python ?

Barbara Streisand
Libérer: 2024-10-19 17:26:30
original
944 Les gens l'ont consulté

Why Does the Scope of Lambda Functions Impact Their Output in Python?

Portée des fonctions Lambda et de leurs paramètres

En Python, les fonctions lambda fournissent une notation abrégée pour définir les fonctions en ligne. Cependant, leur portée et la gestion de leurs paramètres peuvent conduire à un comportement inattendu, comme le démontre le code suivant :

def callback(msg):
    print msg

# Iterative Approach
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))
for f in funcList:
    f()

# Individual Creation
funcList = []
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))
for f in funcList:
    f()
Copier après la connexion

Le résultat attendu est :

do
re
mi
do
re
mi
Copier après la connexion
Copier après la connexion

Cependant, le résultat réel est :

mi
mi
mi
do
re
mi
Copier après la connexion

Ce comportement provient du fait que les fonctions lambda ne créent pas de copies de variables à partir de la portée englobante. Au lieu de cela, ils conservent des références à ces variables. Par conséquent, les modifications apportées à la valeur de m dans la boucle affectent toutes les fonctions lambda créées dans cette boucle.

Pour résoudre ce problème, il est courant de capturer la valeur de m au moment de la création de la fonction lambda. en l'utilisant comme argument par défaut d'un paramètre facultatif :

for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))
Copier après la connexion

Cela garantit que chaque fonction lambda capture la valeur correcte de m, ce qui donne le résultat souhaité :

do
re
mi
do
re
mi
Copier après la connexion
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
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!