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!