Sé que debería evitar el uso de variables globales en primer lugar debido a una confusión como esta, pero si tuviera que usarlas, ¿es la siguiente forma válida de usarlas? (Estoy tratando de llamar a la copia global de una variable creada en una función separada).
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x = func_A()
# Do things
return x
func_A()
func_B()
¿El x
que usa la segunda función tiene el mismo valor de la copia global x
que func_a
usa y modifica? Al llamar a las funciones después de la definición, ¿importa el orden?
python
global-variables
Akshat Shekhar
fuente
fuente
Respuestas:
Si desea acceder simplemente a una variable global, simplemente use su nombre. Sin embargo, para cambiar su valor, debe usar la
global
palabra clave.P.ej
Esto cambiaría el valor de la variable global a 55. De lo contrario, simplemente asignaría 55 a una variable local.
El orden de las listas de definición de funciones no importa (suponiendo que no se refieran entre sí de alguna manera), sí lo hace el orden en que se llaman.
fuente
x
infunc_B
es una variable local que obtiene su valor del valor de retorno de la llamada afunc_A
- así que supongo que eso lo convertiría en su (2)func_A
cambia la variable global durante cada ejecución y la vuelvefunc_B
a usar,func_B
funcionará con un valor modificado cada vez. No estoy seguro acerca de su "cómo solucionarlo". Es posible que desee aceptar la respuesta más útil a su pregunta actual / original y luego considerar abrir una pregunta diferente sobre lo que parece una pregunta de seguimiento.x.append("...")
, es la variable global x la que cambia, porque la local hace referencia a la global.Dentro de un alcance de Python, cualquier asignación a una variable que aún no se haya declarado dentro de ese alcance crea una nueva variable local a menos que dicha variable se declare anteriormente en la función como una referencia a una variable de ámbito global con la palabra clave
global
.Veamos una versión modificada de su pseudocódigo para ver qué sucede:
De hecho, podría reescribir todo
func_B
con la variable nombradax_local
y funcionaría de manera idéntica.El orden solo importa en la medida en que sus funciones realizan operaciones que cambian el valor de la x global. Por lo tanto, en nuestro ejemplo, el orden no importa, ya que las
func_B
llamadasfunc_A
. En este ejemplo, el orden sí importa:Tenga en cuenta que
global
solo es necesario para modificar objetos globales. Aún puede acceder a ellos desde una función sin declararlosglobal
. Por lo tanto, tenemos:Tenga en cuenta que la diferencia entre
create_locally
yaccess_only
-access_only
es acceder a la x global a pesar de no llamarglobal
, y aunquecreate_locally
no usaglobal
ninguno, crea una copia local ya que está asignando un valor.La confusión aquí es por qué no debe usar variables globales.
fuente
Como otros han señalado, debe declarar una variable
global
en una función cuando desea que esa función pueda modificar la variable global. Si solo quieres acceder a él, entonces no lo necesitasglobal
.Para entrar en un poco más de detalle sobre eso, lo que significa "modificar" es esto: si desea volver a vincular el nombre global para que apunte a un objeto diferente, el nombre debe declararse
global
en la función.Muchas operaciones que modifican (mutan) un objeto no vuelven a vincular el nombre global para apuntar a un objeto diferente, por lo que todas son válidas sin declarar el nombre
global
en la función.fuente
Aquí hay un caso que me sorprendió, usando un valor global como valor predeterminado de un parámetro.
Esperaba que param tuviera un valor de 42. Sorpresa. Python 2.7 evaluó el valor de globVar cuando analizó por primera vez la función func. Cambiar el valor de globVar no afectó el valor predeterminado asignado a param. Retrasar la evaluación, como en el siguiente, funcionó como lo necesitaba.
O, si quieres estar a salvo,
fuente
is
para verificar si algo esNone
, en lugar de la comparación normal==
.Puede acceder directamente a una variable global dentro de una función. Si desea cambiar el valor de esa variable global, use "global variable_name". Vea el siguiente ejemplo:
En términos generales, esta no es una buena práctica de programación. Al romper la lógica del espacio de nombres, el código puede volverse difícil de entender y depurar.
fuente
Debe usar la
global
declaración cuando desee alterar el valor asignado a una variable global.No lo necesita para leer desde una variable global. Tenga en cuenta que llamar a un método en un objeto (incluso si altera los datos dentro de ese objeto) no altera el valor de la variable que contiene ese objeto (ausencia de magia reflexiva).
fuente
xs.append(xs.pop(0))
funciona bien singlobal xs
.