2008-09-28 9 views
38

Je suis en train de comprendre ceci:portée Python

c = 1 
def f(n): 
    print c + n 
def g(n): 
    c = c + n 

f(1) => 2 
g(1) => UnboundLocalError: local variable 'c' referenced before assignment 

Merci!

Répondre

51

Au sein d'une fonction, les variables affectées sont traitées comme des variables locales par défaut. Pour affecter à des variables globales, utilisez l'instruction global:

def g(n): 
    global c 
    c = c + n 

Ceci est l'une des zones excentriques de Python qui n'a jamais vraiment bien avec moi sat.

+0

Ceci est similaire à PHP, il nécessite également l'utilisation de 'global'. –

11

L'état global est quelque chose à éviter, en particulier besoin de le muter. Considérez si g() doit simplement prendre deux paramètres ou si f() et g() doivent être des méthodes d'une classe commune avec c une instance d'attribut

class A: 
    c = 1 
    def f(self, n): 
     print self.c + n 
    def g(self, n): 
     self.c += n 

a = A() 
a.f(1) 
a.g(1) 
a.f(1) 

Sorties:

2 
3 
2

autre que ce que dit Greg, en Python 3.0, il y aura l'instruction non locale pour indiquer "voici quelques noms qui sont définis dans la portée englobante". Contrairement à la globalité, ces noms doivent déjà être définis en dehors de la portée actuelle. Il sera facile de retrouver les noms et les variables. De nos jours vous ne pouvez pas être sûr où "quelque chose de globals" est exactement défini.

9

Errata pour Greg's post:

Il ne doit pas être avant qu'elles ne soient. Jetez un coup d'œil:

 
x = 1 
def explode(): 
    print x # raises UnboundLocalError here 
    x = 2 

Il explose, même si x est affecté après sa référence. Dans Python, la variable peut être locale ou renvoyer la portée externe et ne peut pas changer dans une fonction.