2010-07-30 11 views
0

Spécifiquement, comment les variables libres sont-elles liées à la définition pour les méthodes d'une classe? Il est probablement quelque chose comme ceci:Quel est l'ordre de recherche des variables libres dans Python?

  1. scope => générer aucune fermeture fonction enfermant (temporaire) scope => générer la fermeture
  2. global (permanent) (il suffit de regarder vers le haut lorsque le corps de méthode exécute)
  3. soulever UnboundLocalError()

Voici deux exemples:

globalname = 0 
class Test(object): 
    def method(self): 
     print globalname 
     print Test 

def outer(): 
    localname = 1 
    class Test(object): 
     def method(self): 
      print globalname 
      print localname 
      print Test 
    return Test 

Test().method.__func__.__closure__ 
# None 
outer()().method.__func__.__closure__ 
# (<cell at 0xb7d655b4: type object at 0x82412bc>, <cell at 0xb7d655cc: int object at 0x81b20b0>) 

je ne pouvais pas trouver beaucoup de documentation sur spécifiquement comment ils sont traités au moment de la définition. L'explication ci-dessus est-elle correcte?

Répondre

2

Python suppose qu'une variable est locale si et seulement si elle est assignée à, dans le bloc de code courant. Alors

spam = 0 
def ham: 
    print(spam) 

fera le spam une variable globale, mais

spam = 0 
def ham: 
    spam = 0 
    print(spam) 

fera une variable séparée, local ham. Une fermeture saisit toutes les variables locales à la portée englobante. Dans votre premier exemple, il n'y a pas de variables locales donc pas de fermeture; dans la seconde, localname est affecté à et method est donc une fermeture.

Comme toujours en Python, il existe des moyens de contourner cette hypothèse. Le mot clé global déclare une variable comme globale (!), Donc par ex.

spam = 0 
def ham: 
    global spam 
    spam = 0 
    print(spam) 

sera pas une fermeture. Py3k introduit le mot-clé nonlocal, qui indique à Python de regarder vers le haut à travers les portées jusqu'à ce qu'il trouve le nom de la variable et se réfère à cela.

+0

P.S. C'est essentiellement la seule chose que je pense est non intuitive à propos de Python. – katrielalex