with tutorial framework espaƱol djangoproject desde con cero applications python global-variables

python - framework - tutorial django



Uso de la palabra clave "global" en Python (10)

El acceso a un nombre y la asignación de un nombre son diferentes. En tu caso, solo estás accediendo a un nombre.

Si asigna una variable dentro de una función, se asume que esa variable es local a menos que la declare global. En ausencia de eso, se asume que es global.

>>> x = 1 # global >>> def foo(): print x # accessing it, it is global >>> foo() 1 >>> def foo(): x = 2 # local x print x >>> x # global x 1 >>> foo() # prints local x 2

Lo que entiendo de la lectura de la documentación es que Python tiene un espacio de nombres separado para funciones, y si quiero usar una variable global en esa función, necesito usar global .

Estoy usando Python 2.7 y probé esta pequeña prueba

>>> sub = [''0'', ''0'', ''0'', ''0''] >>> def getJoin(): ... return ''.''.join(sub) ... >>> getJoin() ''0.0.0.0''

Parece que las cosas están funcionando bien, incluso sin global . Pude acceder a la variable global sin ningún problema.

¿Me estoy perdiendo algo? Además, lo siguiente es de la documentación de Python:

Los nombres listados en una declaración global no deben definirse como parámetros formales o en un objetivo de control de bucle, definición de clase, definición de función o declaración de importación.

Si bien los parámetros formales y la definición de clase tienen sentido para mí, no puedo entender la restricción para el objetivo de control de bucle y la definición de función.


Esta es la diferencia entre acceder al nombre y binding dentro de un ámbito.

Si solo está buscando una variable para leer su valor, tiene acceso tanto al ámbito global como al local.

Sin embargo, si asigna a una variable cuyo nombre no está en el ámbito local, está vinculando ese nombre en este ámbito (y si ese nombre también existe como global, lo ocultará).

Si desea poder asignar el nombre global, necesita decirle al analizador que use el nombre global en lugar de unir un nuevo nombre local, que es lo que hace la palabra clave ''global''.

El enlace en cualquier lugar dentro de un bloque hace que el nombre en todas partes de ese bloque se convierta en un enlace, lo que puede causar algunas consecuencias de aspecto bastante extraño (por ejemplo, UnboundLocalError aparece repentinamente en el código que funciona anteriormente).

>>> a = 1 >>> def p(): print(a) # accessing global scope, no binding going on >>> def q(): a = 3 # binding a name in local scope - hiding global print(a) >>> def r(): print(a) # fail - a is bound to local scope, but not assigned yet a = 4 >>> p() 1 >>> q() 3 >>> r() Traceback (most recent call last): File "<pyshell#35>", line 1, in <module> r() File "<pyshell#32>", line 2, in r print(a) # fail - a is bound to local scope, but not assigned yet UnboundLocalError: local variable ''a'' referenced before assignment >>>


Global hace la variable "Global".

def out(): global x x = 1 print(x) return out() print (x)

Esto hace que ''x'' actúe como una variable normal fuera de la función. Si eliminara el global, daría un error, ya que no puede imprimir una variable dentro de una función.

def out(): # Taking out the global will give you an error since the variable x is no longer ''global'' or in other words: accessible for other commands x = 1 print(x) return out() print (x)


La palabra clave global solo es útil para cambiar o crear variables globales en un contexto local, aunque crear variables globales rara vez se considera una buena solución.

def bob(): me = "locally defined" # Defined only in local context print me bob() print me # Asking for a global variable

Lo anterior te dará:

locally defined Traceback (most recent call last): File "file.py", line 9, in <module> print me NameError: name ''me'' is not defined

Mientras que si usa la declaración global , la variable estará disponible "fuera" del alcance de la función, convirtiéndose efectivamente en una variable global.

def bob(): global me me = "locally defined" # Defined locally but declared as global print me bob() print me # Asking for a global variable

Así que el código anterior te dará:

locally defined locally defined

Además, debido a la naturaleza de python, también puede usar global para declarar funciones, clases u otros objetos en un contexto local. Aunque desaconsejaría esto, ya que causa pesadillas si algo sale mal o necesita depuración.


Las otras respuestas responden a tu pregunta. Otra cosa importante que se debe saber sobre los nombres en Python es que son locales o globales por alcance.

Considera esto, por ejemplo:

value = 42 def doit(): print value value = 0 doit() print value

Probablemente pueda adivinar que la declaración value = 0 asignará a una variable local y no afectará el valor de la misma variable declarada fuera de la función doit() . Es posible que se sorprenda más al descubrir que el código anterior no se ejecutará. El print value declaración dentro de la función produce un UnboundLocalError.

La razón es que Python se ha dado cuenta de que, en otras partes de la función, asigna el value del nombre, y en ningún caso se declara global . Eso lo convierte en una variable local. Pero cuando intenta imprimirlo, el nombre local aún no se ha definido. Python en este caso no recurre a buscar el nombre como variable global, como lo hacen otros idiomas. Esencialmente, no puede acceder a una variable global si ha definido una variable local con el mismo nombre en cualquier lugar de la función.


Se supone que cualquier variable declarada fuera de una función es global, solo cuando se declara desde dentro de funciones (excepto los constructores), debe especificar que la variable sea global.


Si bien puede acceder a las variables globales sin la palabra clave global , si desea modificarlas, debe utilizar la palabra clave global . Por ejemplo:

foo = 1 def test(): foo = 2 # new local foo def blub(): global foo foo = 3 # changes the value of the global foo

En su caso, acaba de acceder a la lista de sub .


Significa que no debes hacer lo siguiente:

x = 1 def myfunc(): global x # formal parameter def localfunction(x): return x+1 # import statement import os.path as x # for loop control target for x in range(10): print x # class definition class x(object): def __init__(self): pass #function definition def x(): print "I''m bad"


Te daré un ejemplo simple: piensa en este código:

myVar = 0 print (myVar ) # 01 line: returns 0 def func(): myVar = "def" print (myVar ) func() # 02 line: returns def print (myVar ) # 03 line: returns 0

como puede ver, la última línea de código devolverá 0, porque dentro de la función no se ha reasignado la variable myVar , solo se ha modificado y solo cambia cuando la función llamada sin afectar la variable principal myVar, porque está definida dentro nuestra función (significa que es una variable local) , pero con el uso de una palabra clave global como tal:

myVar = 0 print (myVar ) # 01 Line : returns 0 def func(): global myVar myVar = "def" print (myVar ) func() # 02 Line : returns def print (myVar ) # 03 Line : returns def

En realidad, ordenamos a Python que esta variable dentro de la definición no sea local, use una variable global llamada myVar para cambiarla.


  • Puede acceder a palabras clave global sin palabra clave global
  • Para poder modificarlos, debe indicar explícitamente que la palabra clave es global. De lo contrario, la palabra clave se declarará en el ámbito local.

Ejemplo:

words = [...] def contains (word): global words # <- not really needed return (word in words) def add (word): global words # must specify that we''re working with a global keyword if word not in words: words += [word]