2009-11-23 7 views
3

Je suis un programmeur python débutant, et j'aimerais que quelqu'un clarifie le comportement suivant.Lambdas imbriquées en Python

J'ai le code suivant:

env = lambda id: -1 

def add(id, val, myenv): 
    return lambda x: val if x == id else myenv(id) 

test_env = add("a", 1, env) 
test_env_2 = add("b", 2, test_env) 

Quand je regarde « a » dans test_env, il fonctionne correctement, mais quand je regarde vers le haut en test_env_2 il semble avoir été mis à mal par « b ». Au moins, "b" est tout ce que je peux récupérer de test_env_2. Donc, j'ai déjà lu Scope of python lambda functions and their parameters et autres et je comprends que les fermetures fonctionnent sur des références plutôt que sur des valeurs, mais je crois que ce n'est pas exactement le même cas puisque j'utilise des littéraux de chaîne. Quelqu'un peut-il m'expliquer ce qui se passe sous le capot ici?

(Et oui, je sais que Python ne prétend pas être un langage fonctionnel. Ceci est juste la recherche.)

+1

Python est multiparadigm, mais le style fonctionnel est considéré comme pythoniquement! – Dario

Répondre

5

Je pense que vous venez de confondre myenv(id) avec myenv(x). Changez-le et vous obtiendrez la sortie désirée.

+0

Quelle erreur stupide. Merci. – danben