2017-10-09 15 views
1

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.

+0

vous devez lier la variable à la fonction lambda. –

+2

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. –

+0

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 ** –

Répondre

1

L'astuce habituelle, qui date avant l'introduction de la fermeture du tout, est d'utiliser « paramètres optionnels »:

demo_lamb = lambda left, right=right: print("INSIDE LAMB left == ", left, ",", "right == ", right) 

arguments par défaut sont évalués lorsque la fonction est définie, ce qui est exactement ce que vous voulez .