Comment éviter un comportement inattendu dans les fonctions Lambda en raison de variables de portée partagée ?

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

How to Avoid Unexpected Behavior in Lambda Functions Due to Shared Scope Variables?

Comportement de portée des fonctions Lambda et de leurs paramètres

Lorsqu'une fonction lambda est créée, elle hérite de la portée de sa fonction englobante. Cependant, une idée fausse courante surgit lors de l'utilisation de boucles d'itérateur pour générer une série de fonctions lambda. Dans de tels cas, les fonctions lambda partagent la même variable de portée, ce qui conduit à des résultats inattendus.

Considérez le code simplifié 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))

# Executing the functions
for f in funcList:
    f()</code>
Copier après la connexion

Le résultat attendu est :

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

Cependant, le résultat réel est :

mi
mi
mi
Copier après la connexion

Cela se produit parce que la fonction lambda, une fois créée, conserve une référence à la variable partagée m dans la portée englobante. Au moment où les fonctions lambda sont exécutées, m a été réaffecté à « mi », ce qui entraîne une sortie inattendue.

Pour résoudre ce problème, on peut utiliser un paramètre facultatif avec une valeur par défaut. Cela permet à chaque fonction lambda de capturer sa propre valeur de la variable :

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

Avec cette modification, chaque fonction lambda conserve une copie distincte de la valeur de m au moment de sa création, produisant le résultat souhaité :

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!