Definiendo listas como variables globales en Python

Estoy usando una lista en la que algunas funciones funcionan en mi progtwig. Esta es una lista compartida en realidad y todas mis funciones pueden editarla. ¿Es realmente necesario definirlo como “global” en todas las funciones?

¿Me refiero a poner la palabra clave global detrás de cada función que la usa, o definirla fuera de todas las funciones es suficiente sin usar la palabra global detrás de su definición?

Cuando asigna una variable ( x = ... ), está creando una variable en el scope actual (por ejemplo, local a la función actual). Si sucede a la sombra de una variable desde un ámbito externo (por ejemplo, global), muy mal, a Python no le importa (y eso es algo bueno). Así que no puedes hacer esto:

 x = 0 def f(): x = 1 f() print x #=>0 

y esperar 1 . En su lugar, debe declarar que pretende usar el global x :

 x = 0 def f(): global x x = 1 f() print x #=>1 

Pero tenga en cuenta que la asignación de una variable es muy diferente de las llamadas a métodos. Siempre puede llamar a métodos en cualquier ámbito, por ejemplo, en variables que provienen de un ámbito externo (por ejemplo, el global) porque nada local los puede ocultar.

También es muy importante: asignación de miembros ( x.name = ... ), asignación de elementos ( collection[key] = ... ), asignación de segmentos ( sliceable[start:end] = ... ) y probablemente más son todas las llamadas a métodos ¡también! Y, por lo tanto, no es necesario que global cambie los miembros de un global o que lo llame a métodos (incluso cuando mutan el objeto).

Sí, necesitas usar global foo si vas a escribir en él.

 foo = [] def bar(): global foo ... foo = [1] 

No, puede especificar la lista como un argumento de palabra clave para su función.

 alist = [] def fn(alist=alist): alist.append(1) fn() print alist # [1] 

Aunque diría que es una mala práctica. Tipo de demasiado hackish. Si realmente necesita usar una estructura de datos de tipo singleton disponible globalmente, usaría el enfoque de variable de nivel de módulo, es decir, poner ‘alist’ en un módulo y luego en sus otros módulos importar esa variable:

En el archivo foomodule.py:

 alist = [] 

En el archivo barmodule.py:

 import foomodule def fn(): foomodule.alist.append(1) print foomodule.alist # [1]