2008-09-28 18 views
38

Estoy tratando de averiguar esto:Python alcance

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 

Gracias!

Respuesta

51

En una función, las variables que se asignan se tratan como variables locales de forma predeterminada. Para asignar a las variables globales, utilice el global declaración:

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

Ésta es una de las zonas peculiares de Python que en realidad nunca ha sentado bien a mí.

+0

Esto es similar a PHP, también requiere el uso de 'global'. –

11

El estado global es algo que se debe evitar, especialmente la necesidad de mutarlo. Tenga en cuenta si g() simplemente debe tomar dos parámetros o si f() y g() necesitan ser métodos de una clase común con c una instancia atribuir

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) 

Salidas:

2 
3 
2

Aparte de lo que dijo Greg, en Python 3.0, habrá una declaración no local para indicar "aquí hay algunos nombres que se definen en el alcance adjunto". A diferencia de global, esos nombres deben estar ya definidos fuera del alcance actual. Será fácil rastrear nombres y variables. Hoy en día no se puede estar seguro de dónde se define exactamente "algo global".

9

erratas para Greg's post:

No debe haber antes de que se hace referencia a. Eche un vistazo:

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

Explota, incluso si x se asigna después de que se haga referencia a él. En Python, la variable puede ser local o referir al ámbito externo, y no puede cambiar en una función.