python scope

Alcance de Python



scope (4)

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".

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de entender esto:

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!


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

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

Esta es una de las áreas extravagantes de Python que nunca me ha sentado bien.


El estado global es algo que hay que evitar, especialmente la necesidad de mutarlo. Considere si g() debería simplemente tomar dos parámetros o si f() y g() necesitan ser métodos de una clase común con c un atributo de instancia

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)

Productos:

2 3


Errata por la publicación de Greg :

No debería haber antes de que sean referenciados . Echar 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.