¿Por qué ocurre este UnboundLocalError (cierre)? [duplicar]
¿Qué estoy haciendo mal aquí?
counter = 0
def increment():
counter += 1
increment()
El código anterior arroja un UnboundLocalError
.
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 counter
local a increment()
. Sin embargo, al intentar ejecutar esta línea se intentará leer el valor de la variable local counter
antes de asignarla, lo que generará un archivo UnboundLocalError
. [2]
Si counter
es una variable global, la global
palabra clave ayudará. Si increment()
es una función local y counter
una variable local, puede usarla nonlocal
en Python 3.x.
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 counter
se 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 counter
mutable y modificarlo:
counter = [0]
def increment():
counter[0] += 1
increment()
print counter[0] # prints '1'