¿Por qué un módulo de python actúa como un singleton?

Creo un diccionario desde una base de datos remota como parte de la ejecución de mi aplicación. Este proceso es bastante pesado en E / S, por lo que decidí crear una instancia “singleton” de este diccionario y simplemente llamarlo cuando sea necesario en mi aplicación.

El código se ve como (en Dictionaries.py ):

 state_code_dict = None def get_state_code_dict(): global state_code_dict if state_code_dict == None: state_code_dict = generate_state_code_dict() return state_code_dict 

Luego importo y llamo a la función get_state_code_dict() donde sea necesario. state_code_dict una statement de impresión para verificar si se estaba reinicializando o reutilizando state_code_dict , y encontré que estaba siendo reutilizada (que es la funcionalidad que quiero). ¿Por qué la instancia de state_code_dict sobrevive a la aplicación ejecutada?

Editar

get_state_code_dict función get_state_code_dict en varios archivos.

Esta es la descripción de Python Language Reference sobre cómo funciona la importación de un módulo :

(1) encuentre un módulo e inicialícelo si es necesario ; (2) define un nombre o nombres en el espacio de nombres local

(Se agregó énfasis). Aquí, inicializar un módulo significa ejecutar su código. Esta ejecución solo se realiza si es necesario , es decir, si el módulo no se importó previamente en el proceso actual. Como los módulos de Python son objetos de tiempo de ejecución de primera clase, se convierten efectivamente en singletons, inicializados en el momento de la primera importación.

Tenga en cuenta que esto significa que no hay necesidad de una función get_state_dict_code ; simplemente inicialice state_code_dict en el nivel superior:

 state_code_dict = generate_state_code_dict() 

Para una explicación más detallada, vea esta charla de Thomas Wouters , esp. la primera parte, alrededor de las 04:20, donde analiza el principio de “todo es tiempo de ejecución”.

He votado larsmans respuesta, solo quería añadir un ejemplo.

hola.py:

 hi = 'hello' print(hi) def print_hi(): print(hi) 

sesión ipython:

 In [1]: from hello import print_hi hello In [2]: print_hi() hello In [3]: from hello import print_hi In [4]: import hello In [5]: hello.print_hi() hello 

Observe que las importaciones en las líneas 3 y 4 no producen “hola” como la importación en la línea 1, lo que significa que el código no se vuelve a ejecutar.