Gestion de la création de fonctions dans les boucles : dépannage de la liaison tardive
Lorsque vous essayez de créer des fonctions dans une boucle, un problème courant survient. Dans l'exemple fourni, l'objectif est de générer trois fonctions qui renvoient respectivement 0, 1 et 2. Cependant, les trois fonctions finissent par renvoyer la même valeur (2). Cela se produit en raison de la liaison tardive, où les fonctions reportent leur évaluation de la variable 'i' jusqu'au dernier moment possible.
Comprendre la liaison tardive
Dans le code sans le correctif :
for i in range(3): def f(): return i
Chaque 'f' recherche 'i' tard dans le exécution de la boucle, moment auquel « i » a atteint sa valeur finale de 2. Par conséquent, les trois fonctions renvoient 2, malgré l'intention de la boucle de créer des fonctions renvoyant 0, 1 et 2.
Correction le problème
La solution à ce problème est d'appliquer une liaison anticipée. Ceci peut être réalisé en passant « i » comme argument à la fonction « f » comme ceci :
for i in range(3): def f(i=i): return i
Dans ce code mis à jour, « i » est recherché au moment de la définition, lorsque la boucle est exécutée plutôt qu'au moment de l'appel lorsque 'f' est exécuté.
Solution alternative utilisant des fermetures
Une autre approche consiste à utilisez une fermeture pour créer une "usine de fonctions" :
def make_f(i): def f(): return i return f
Dans la boucle, 'f' peut ensuite être créé en utilisant 'f = make_f(i)'. Cette approche garantit également une liaison précoce, car la fonction « make_f » transmet la valeur de « i » à « f » au moment de la définition.
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!