Maison > développement back-end > Tutoriel Python > Pourquoi les fonctions créées dans une boucle Python renvoient-elles toutes la même valeur ?

Pourquoi les fonctions créées dans une boucle Python renvoient-elles toutes la même valeur ?

DDD
Libérer: 2024-12-22 01:57:14
original
656 Les gens l'ont consulté

Why Do Functions Created in a Python Loop All Return the Same Value?

Anomalies de création de fonctions et de Lambda dans les boucles

Lors de la tentative de génération de fonctions dans une boucle, comme le montre l'extrait de code ci-dessous, un problème particulier un problème se pose :

functions = []

for i in range(3):
    def f():
        return i
    functions.append(f)
Copier après la connexion

De même, lors de l'utilisation lambdas :

functions = []

for i in range(3):
    functions.append(lambda: i)
Copier après la connexion

On pourrait s'attendre à ce que ces fonctions génèrent des valeurs distinctes (0, 1 et 2), mais toutes les fonctions finissent par donner la même valeur (2).

Explication et solution

Ce phénomène est causé par une liaison tardive des variables. Dans les fonctions Python, les variables sont résolues lorsqu'elles sont appelées, ce qui signifie que lorsque les fonctions sont invoquées après la boucle, la valeur de i est déjà définie sur 2. Pour remédier à cela, nous utilisons une liaison anticipée en introduisant la syntaxe f(i=i). . Ici, la valeur par défaut de l'argument i est établie au moment de la définition, ce qui entraîne une liaison précoce :

def f(i=i):
    return i
Copier après la connexion

Alternativement, une approche plus complexe utilisant une fermeture et une "usine de fonctions" garantit une liaison précoce car eh bien :

def make_f(i):
    def f():
        return i
    return f
Copier après la connexion

Dans la boucle, nous pouvons alors utiliser f = make_f(i) plutôt que l'instruction def.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal