Lorsque vous essayez d'utiliser des fermetures pour supprimer une variable de la signature d'une fonction, vous pouvez rencontrer un comportement inattendu. Plus précisément, une fonction lambda non incluse dans une autre fonction renvoie la dernière valeur de la variable pour toutes les instances.
Pour comprendre ce comportement, il est crucial de reconnaître que les fermetures capturent des noms, pas des valeurs. Lorsque vous définissez un lambda comme lambda x : test_fun(n, x), la variable n n'est pas évaluée au sein de la fonction mais plutôt au moment de l'appel. Par conséquent, la valeur qu'elle prend est la dernière valeur de la boucle.
Pour "éliminer" efficacement une variable à l'aide de fermetures, la variable doit être passée en argument à la fonction. Cela attribue la valeur actuelle de la variable à la fonction et la « verrouille » efficacement. Par exemple :
<code class="python">stuff = [lambda x: n+x for n in [1, 2, 3]] # Bad, captured value is last value stuff = [lambda x, n=n: n+x for n in [1, 2, 3]] # Good, n is locked in</code>
Alternativement, vous pouvez utiliser deux fonctions imbriquées :
<code class="python">def makeFunc(n): return lambda x: x+n stuff = [makeFunc(n) for n in [1, 2, 3]]</code>
Ici, le lambda dans makeFunc capture la variable n locale plutôt que la variable globale. Chaque appel makeFunc crée une nouvelle variable locale, garantissant que les fonctions lambda renvoyées ont des valeurs n uniques.
En fin de compte, le choix entre simplicité et flexibilité vous appartient. Vous pouvez opter pour une création de fonction plus simple avec un argument supplémentaire dans la fonction renvoyée ou des fonctions plus propres avec un processus de création de fonction plus complexe impliquant deux fonctions imbriquées.
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!