2010-10-14 14 views
0

Comme je suis en train d'étudier les décorateurs, j'ai remarqué quelque chose d'étrange:portée variable dans les fonctions imbriquées Python

def f(): 
...  msg='aa' 
...  def a(): 
...    print msg 
...  msg='bb' 
...  def b(): 
...    print msg 
...  return a,b 
... 
>>> a,b = f() 
>>> a() 
bb 
>>> b() 
bb 
>>> 

Pourquoi() retourne 'bb' et non 'aa' ??

Répondre

3

Parce que a et b ont la même portée externe, dans lequel msg est lié à 'bb'. Mettez-les dans des fonctions séparées si vous voulez qu'ils aient des portées distinctes.

+0

oui mais quand a() est défini, msg = 'aa' alors.Est-ce que cela signifie que les fonctions sont vraiment définies à la fin de la fonction parente? – Eric

+1

La portée est liée à la fonction lorsque la fonction est définie. Mais le nom * dans * la portée renvoie à une chaîne différente. –

+0

@Eric: La variable 'msg' n'est pas définie comme une constante" aa ". La variable survit dans la portée locale de 'f', et les fonctions internes' a'/'b' ont accès à cette portée à tout moment ultérieur. Lorsque vous remplacez immédiatement la valeur de 'msg', c'est-à-dire avant d'appeler' a' ou 'b', ils liront la nouvelle valeur. – AndiDog

1

Les deux a et b ont un accès en lecture à l'étendue externe (la portée locale de f). Lorsque vous remplacez la valeur de msg, l'appel ultérieur à a/b lira la nouvelle valeur.

+0

OK, je croyais que c'était comme mécanisme de modèle de langage ADA, en fait, a/b utilise la variable msg encore vivant dans sa portée, ayant ainsi la valeur 'bb' au moment a/b sont exécutés. – Eric