
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!
Comment résoudre le problème selon lequel les CAO ne peuvent pas être copiés dans le presse-papiers
Vérifiez l'état du port occupé dans Windows
Une mémoire capable d'échanger des informations directement avec le CPU est une
Qu'est-ce qu'une base de données relationnelle
Quels sont les systèmes Linux courants ?
Vérifier la taille du dossier sous Linux
css
Pourquoi vue.js signale-t-il une erreur ?