Maison  >  Article  >  développement back-end  >  Comment éviter les résultats inattendus des modifications de paramètres dans les fonctions Lambda

Comment éviter les résultats inattendus des modifications de paramètres dans les fonctions Lambda

Patricia Arquette
Patricia Arquetteoriginal
2024-10-19 17:28:01686parcourir

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

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

Les fonctions Lambda sont des fonctions anonymes qui peuvent capturer la portée de leur fonction englobante. Cela leur permet d'accéder aux variables et aux paramètres de la portée parent. Cependant, ce comportement peut parfois conduire à des résultats inattendus lorsque les fonctions lambda utilisent des paramètres modifiés dans la fonction englobante.

Pour illustrer le problème, considérons le code suivant :

<code class="python">def callback(msg):
    print(msg)

# Creating a list of function handles with an iterator
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))

# Calling the lambda functions
for f in funcList:
    f()</code>

Le attendu la sortie de ce code est :

do
re
mi

Cependant, la sortie réelle est :

mi
mi
mi

En effet, les fonctions lambda capturent une référence à la variable m à partir de la portée englobante. Lorsque l'itérateur exécute la boucle, il attribue la valeur « mi » à m lors de l'itération finale. Par conséquent, toutes les fonctions lambda ont une référence à 'mi' lorsqu'elles sont exécutées, même si différentes valeurs leur ont été transmises lors de la création.

Pour résoudre ce problème, vous pouvez capturer la valeur de m à l'heure de création de la fonction lambda en l'utilisant comme valeur par défaut d'un paramètre facultatif :

<code class="python">for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))</code>

Cela garantit que chaque fonction lambda a accès à sa propre copie de m, capturant la valeur qui a été attribuée lors de la création de la fonction lambda. itération de boucle. La sortie de ce code sera :

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!

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