¿Por qué ocurre este UnboundLocalError (cierre)? [duplicar]

Resuelto Randomblue asked hace 12 años • 8 respuestas

¿Qué estoy haciendo mal aquí?

counter = 0

def increment():
  counter += 1

increment()

El código anterior arroja un UnboundLocalError.

Randomblue avatar Feb 14 '12 00:02 Randomblue
Aceptado

Python no tiene declaraciones de variables, por lo que tiene que determinar el alcance de las variables por sí mismo. Lo hace mediante una regla simple: si hay una asignación a una variable dentro de una función, esa variable se considera local. [1] Así, la línea

counter += 1

implícitamente hace counterlocal a increment(). Sin embargo, al intentar ejecutar esta línea se intentará leer el valor de la variable local counterantes de asignarla, lo que generará un archivo UnboundLocalError. [2]

Si counteres una variable global, la globalpalabra clave ayudará. Si increment()es una función local y counteruna variable local, puede usarla nonlocalen Python 3.x.

Sven Marnach avatar Feb 13 '2012 17:02 Sven Marnach

Debe utilizar la declaración global para modificar el contador de la variable global, en lugar de una variable local:

counter = 0

def increment():
  global counter
  counter += 1

increment()

Si el alcance adjunto que counterse define en no es el alcance global, en Python 3.x podría usar la declaración no local . En la misma situación en Python 2.x, no tendría forma de reasignarlo al nombre no local counter, por lo que necesitaría hacerlo countermutable y modificarlo:

counter = [0]

def increment():
  counter[0] += 1

increment()
print counter[0]  # prints '1'
Andrew Clark avatar Feb 13 '2012 17:02 Andrew Clark