Lors de la création de fonctions ou de lambdas dans une boucle, il est important de considérer le concept de reliure tardive. Dans l'exemple donné :
functions = [] for i in range(3): def f(): return i functions.append(f)
chaque fonction recherche la valeur de i le plus tard possible, c'est-à-dire après la fin de la boucle. Par conséquent, toutes les fonctions renvoient la valeur finale de i, qui est 2.
Pour résoudre ce problème et obtenir trois fonctions distinctes qui génèrent 0, 1 et 2, nous devons forcer la liaison anticipée. Ceci peut être réalisé en utilisant les paramètres par défaut :
functions = [] for i in range(3): def f(i=i): # Default parameter for i return i functions.append(f)
Dans ce cas, le paramètre par défaut i est évalué au moment de la définition, et non au moment de l'appel, garantissant que chaque fonction utilise la valeur correcte de i.
Alternativement, nous pouvons utiliser une fabrique de fonctions pour créer des fonctions avec une liaison précoce :
def make_f(i): def f(): return i return f functions = [] for i in range(3): functions.append(make_f(i))
La fonction make_f crée une nouvelle fonction avec la valeur correcte de i lié tôt.
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!