Maison > développement back-end > Tutoriel Python > Pourquoi les fonctions créées dans une boucle renvoient-elles la même valeur et comment puis-je y remédier ?

Pourquoi les fonctions créées dans une boucle renvoient-elles la même valeur et comment puis-je y remédier ?

Linda Hamilton
Libérer: 2025-01-04 13:05:47
original
558 Les gens l'ont consulté

Why Do Functions Created in a Loop Return the Same Value, and How Can I Fix It?

Création de fonctions (ou lambdas) dans une boucle (ou compréhension) : comprendre la liaison tardive

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

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

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

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!

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