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()
Le résultat attendu est :
do re mi do re mi
Cependant, le résultat réel est :
mi mi mi do re mi
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))
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
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!