Supposons que quelqu'un veuille faire une fonction lambda, et qu'il veuille que tout dans la fonction lambda, à l'exception des arguments d'entrée, soit traité comme les variables locales d'une fonction. Comment pourraient-ils accomplir cela? En disant que les variables sont "locales", je veux dire qu'il n'y a pas d'accès à ces variables depuis l'extérieur de la fonction lambda.Comment empêcher les variables locales de la fonction lamda de changer en python?
code
right = 5
demo_lamb = lambda left : print("INSIDE LAMB left == ", left, ",", "right == ", right)
for lt in range(0, 5):
demo_lamb(lt)
right = 100*lt + 99
print("OUTSIDE LAMB right == ", right)
Printed Sortie
INSIDE LAMB left == 0 , right == 5
OUTSIDE LAMB right == 99
INSIDE LAMB left == 1 , right == 99
OUTSIDE LAMB right == 199
INSIDE LAMB left == 2 , right == 199
OUTSIDE LAMB right == 299
INSIDE LAMB left == 3 , right == 299
OUTSIDE LAMB right == 399
INSIDE LAMB left == 4 , right == 399
OUTSIDE LAMB right == 499
désiré Sortie
INSIDE LAMB left == 0 , right == 5
OUTSIDE LAMB right == 99
INSIDE LAMB left == 1 , right == 5
OUTSIDE LAMB right == 199
INSIDE LAMB left == 2 , right == 5
OUTSIDE LAMB right == 299
INSIDE LAMB left == 3 , right == 5
OUTSIDE LAMB right == 399
INSIDE LAMB left == 4 , right == 5
OUTSIDE LAMB right == 499
Comment pouvons-nous "geler" la valeur de toutes les variables à l'intérieur d'une fonction lambda (à l'exception les arguments d'entrée) pour être ce qu'ils étaient quand la fonction lambda a été créée?
Un échec Solution
Importation copy
et le remplacement right
dans la fonction lambda avec copy.deepcopy(right)
ne fait aucune différence à la sortie que ce soit.
vous devez lier la variable à la fonction lambda. –
Si vous utilisez 'some_var = lambda' vous ne devriez pas utiliser 'lambda' en premier lieu, cela détruit le seul avantage ** qui est qu'un' lambda' est anonyme. –
Et le problème est que 'right' n'est pas une variable locale, c'est une * variable libre * fermée sur la fonction. Le problème est que Python a une portée lexicale, donc 'right' se réfère toujours à' right' dans la portée globale. La meilleure chose à faire est simplement d'en faire un paramètre. En outre, cela n'a rien à voir avec les fonctions 'lambda', mais ** toutes les fonctions fonctionnent de cette façon ** –