xticks barplot python global-variables scope

barplot - UnboundLocalError en Python



subplot title python (8)

Debe usar la instrucción global para modificar el contador de variables globales, en lugar de una variable local:

counter = 0 def increment(): global counter counter += 1 increment()

Si el ámbito adjunto en el que se define el counter no es el ámbito global, en Python 3.x puede usar la instrucción no local . En la misma situación en Python 2.x no tendría manera de reasignar al counter nombres no locales, por lo que necesitaría hacer el counter mutable y modificarlo:

counter = [0] def increment(): counter[0] += 1 increment() print counter[0] # prints ''1''

Esta pregunta ya tiene una respuesta aquí:

¿Qué estoy haciendo mal aquí?

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

El código anterior arroja UnboundLocalError .


La razón por la cual su código arroja un UnboundLocalError ya está bien explicada en otras respuestas.

Pero me parece que estás tratando de construir algo que funcione como itertools.count() .

Entonces, ¿por qué no lo pruebas y ves si se adapta a tu caso?

>>> from itertools import count >>> counter = count(0) >>> counter count(0) >>> next(counter) 0 >>> counter count(1) >>> next(counter) 1 >>> counter count(2)


Para modificar una variable global dentro de una función, debe usar la palabra clave global.

Cuando tratas de hacer esto sin la línea

global counter

dentro de la definición de incremento, se crea una variable local llamada contador para evitar que se arruine la variable de contador de la que puede depender todo el programa.

Tenga en cuenta que solo necesita usar global cuando está modificando la variable; podría leer el contador desde el incremento sin la necesidad de la declaración global.


Para responder a la pregunta en su línea de asunto, * sí, hay cierres en Python, excepto que solo se aplican dentro de una función, y también (en Python 2.x) son de solo lectura; no puede volver a vincular el nombre a un objeto diferente (aunque si el objeto es mutable, puede modificar su contenido). En Python 3.x, puede usar la palabra clave nonlocal para modificar una variable de cierre.

def incrementer(): counter = 0 def increment(): nonlocal counter counter += 1 return counter return increment increment = incrementer() increment() # 1 increment() # 2

* El título de la pregunta original preguntó sobre los cierres en Python.


Python no tiene declaraciones de variables, por lo que tiene que descubrir el scope de las variables en sí. 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] Por lo tanto, la línea

counter += 1

implícitamente hace counter local a increment() . Sin embargo, al tratar de ejecutar esta línea, intentará leer el valor del counter variables locales antes de asignarlo, lo que UnboundLocalError resultado un UnboundLocalError . [2]

Si el counter es una variable global, la palabra clave global ayudará. Si increment() es una función local y counter una variable local, puede usar nonlocal en Python 3.x.



Python tiene un alcance léxico por defecto, lo que significa que, aunque un ámbito cerrado puede acceder a valores en su ámbito adjunto, no puede modificarlos (a menos que se declaren globales con la palabra clave global ).

Un cierre vincula valores en el entorno circundante a nombres en el entorno local . El entorno local puede usar el valor enlazado e incluso reasignar ese nombre a otra cosa, pero no puede modificar el enlace en el entorno circundante.

En su caso, intenta tratar el counter como una variable local en lugar de un valor consolidado. Tenga en cuenta que este código, que vincula el valor de x asignado en el entorno adjunto, funciona bien:

>>> x = 1 >>> def f(): >>> return x >>> f() 1


prueba esto

counter = 0 def increment(): global counter counter += 1 increment()