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
DDDoriginal
2024-12-22 01:57:14657parcourir

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)

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

functions = []

for i in range(3):
    functions.append(lambda: i)

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

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

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!

Déclaration:
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