Lo que entiendo al leer la documentación es que Python tiene un espacio de nombres separado para las funciones, y si quiero usar una variable global en esa función, necesito usarla 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 funcionan bien incluso sin ellas 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 enumerados 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.
def foo(): ...
yfoo = ...
al mismo tiempo). Crea un nuevo alcance para cada llamada a la función. (Pero, ¿cómo se diferencia de casi cualquier otro idioma de forma remota de alto nivel en el mundo?)Respuestas:
La palabra clave
global
solo es útil para cambiar o crear variables globales en un contexto local, aunque la creación de variables globales rara vez se considera una buena solución.Lo anterior te dará:
Mientras que si usa la
global
instrucción, la variable estará disponible "fuera" del alcance de la función, convirtiéndose efectivamente en una variable global.Entonces el código anterior te dará:
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 recomendaría no hacerlo, ya que causa pesadillas si algo sale mal o necesita depuración.fuente
globals
definido automáticamente en todos los espacios de nombres (afortunadamente). Como señaló correctamente, un global está vinculado a un espacio de nombres dentro de un módulo, sin embargo, puede importarse a otro módulo comofrom module import variable
oimport module.variable
. En el primer caso, la importación haría accesible la variablevariable
sin requerir referencia comomodule.
. Si se considera global en el alcance del módulo, dependerá de dónde se importe. Véase tambiénnonlocal
como una nueva palabra clave relacionada con el alcance en python 3.Si bien puede acceder a las variables globales sin la
global
palabra clave, si desea modificarlas, debe usar laglobal
palabra clave. Por ejemplo:En su caso, solo está accediendo a la lista
sub
.fuente
foo = 3
sin trabajos globales, pero foo se define nuevamente localmente en elblub
alcance de la función y no modifica la variable foo original. Esto fue bastante confuso para mí.Esta es la diferencia entre acceder al nombre y vincularlo dentro de un ámbito.
Si solo está buscando una variable para leer su valor, tiene acceso a un alcance global y local.
Sin embargo, si asigna a una variable cuyo nombre no está en el ámbito local, está vinculando ese nombre a este ámbito (y si ese nombre también existe como global, lo ocultará).
Si desea poder asignar el nombre global, debe decirle al analizador que use el nombre global en lugar de vincular un nuevo nombre local, que es lo que hace la palabra clave 'global'.
La vinculación en cualquier lugar dentro de un bloque hace que el nombre en todas partes de ese bloque se vincule, lo que puede causar algunas consecuencias de aspecto bastante extraño (por ejemplo, UnboundLocalError aparece repentinamente en el código que funcionaba anteriormente).
fuente
Las otras respuestas responden a su pregunta. Otra cosa importante que debe saber sobre los nombres en Python es que son locales o globales según el alcance.
Considere esto, por ejemplo:
Probablemente pueda adivinar que la
value = 0
instrucción se asignará a una variable local y no afectará el valor de la misma variable declarada fuera de ladoit()
función. Puede que se sorprenda más al descubrir que el código anterior no se ejecutará. La declaraciónprint value
dentro de la función produce unUnboundLocalError.
La razón es que Python ha notado que, en otra parte de la función, se le asigna el nombre
value
, y tampocovalue
se declara en ninguna parteglobal
. 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 una variable global, como lo hacen algunos 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.fuente
global
(ononlocal
en Python 3.x) anula este comportamiento y le permite reasignar el nombre externo.let
son no izada.global
o no importa?Acceder a un nombre y asignar un nombre son diferentes. En su caso, solo está accediendo a un nombre.
Si asigna a 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 supone que es global.
fuente
global
Ejemplo:
fuente
Se supone que cualquier variable declarada fuera de una función es global, es solo cuando se declaran desde dentro de las funciones (excepto los constructores) que debe especificar que la variable sea global.
fuente
Esto se explica bien en las preguntas frecuentes de Python
https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
fuente
Significa que no debe hacer lo siguiente:
fuente
Global hace que la variable "Global"
Esto hace que 'x' actúe como una variable normal fuera de la función. Si eliminó el global, entonces daría un error ya que no puede imprimir una variable dentro de una función.
fuente