Maison > développement back-end > Tutoriel Python > 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
Libérer: 2024-10-19 17:28:01
original
857 Les gens l'ont consulté

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>
Copier après la connexion

Le attendu la sortie de ce code est :

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

Cependant, la sortie réelle est :

mi
mi
mi
Copier après la connexion

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>
Copier après la connexion

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
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