Maison > développement back-end > Tutoriel Python > Pourquoi les fonctions créées dans des boucles renvoient-elles parfois des valeurs erronées ?

Pourquoi les fonctions créées dans des boucles renvoient-elles parfois des valeurs erronées ?

Linda Hamilton
Libérer: 2024-12-27 18:11:15
original
365 Les gens l'ont consulté

Why Do Functions Created in Loops Sometimes Return the Wrong Values?

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

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

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

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!

source:php.cn
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