La primera y obvia pregunta es por qué?
Hay algunas situaciones en las que las variables globales son necesarias/útiles, pero son pocas.
Su problema es con espacios de nombres. Cuando importa común en second.py, GLOBAL_ONE
proviene de ese espacio de nombres. Cuando importa secondTest, todavía hace referencia a GLOBAL_ONE
desde common.py.
Su problema real, sin embargo, es con el diseño. No puedo pensar en un solo motivo lógico bueno razón para implementar una variable global de esta manera. Las variables globales son un asunto complicado en Python porque no existe una variable constante. Sin embargo, la convención es que cuando desea mantener algo constante en Python, llámelo WITH_ALL_CAPS
. Ergo:
somevar = MY_GLOBAL_VAR # good!
MY_GLOBAL_VAR = somevar # What? You "can't" assign to a constant! Bad!
Hay un montón de razones por las que hacer algo como esto:
earth = 6e24
def badfunction():
global earth
earth += 1e5
print '%.2e' % earth
es terrible.
Por supuesto, si solo está haciendo esto como ejercicio para entender los espacios de nombres y la llamada global
, continúe.
Si no es así, algunas de las razones por las que las variables globales son una mala cosa ™ son:
- contaminación Espacio de nombres
- integración funcional - desea que sus funciones sean compartimentados
- efectos secundarios funcionales - lo sucede cuando escribe una función que modifica la variable global
balance
y usted u otra persona está reutilizando su función y no la toma en cuenta? Si estaba calculando el saldo de la cuenta, de repente tiene demasiado o no tiene suficiente. Los errores como este son difíciles de encontrar.
Si tiene una función que necesita un valor, debe pasarlo como un parámetro, a menos que tenga una razón muy buena de lo contrario. Una de las razones sería tener un mundial de PI - dependiendo de su precisión necesita puede que quiera que sea 3.14
, o es posible que desee que 3.14159265
... pero eso es una caso en que un mundial tiene sentido. Probablemente haya solo un puñado o dos de casos del mundo real que pueden usar elementos globales correctamente. Uno de los casos son constantes en la programación de juegos. Es más fácil importar pygame.locals y utilizar KP_UP que recordar el valor entero que responde a ese evento. Estas son excepciones a la regla.
Y (al menos en pygame) estas constantes se almacenan en un archivo separado - sólo para las constantes. Cualquier módulo que necesite esas constantes importará dichas constantes.
Al programar, escribir funciones para romper su problema en trozos manejables. Preferiblemente, una función debe hacer una cosa, y no tener efectos secundarios. Eso significa que una función como calculatetime() debe calcular el tiempo. Probablemente no debería ir a leer un archivo que contiene el tiempo, y prohibir que haga algo como escribir el tiempo en algún lugar. Puede devolver el tiempo, y tomar los parámetros si los necesita, ambos son cosas buenas y aceptables para las funciones. Las funciones son una especie de contrato entre usted (el programador de la función) y cualquier persona (incluido usted) que use la función. Acceder a y cambiar las variables globales son una violación de ese contrato porque la función puede modificar los datos externos de formas que no están definidas o previstas. Cuando uso esa función calculatetime()
, espero que calcule el tiempo y probablemente lo devuelva, no modifique el tiempo de la variable global que responde al tiempo del módulo que acabo de importar.
Modificación de las variables globales romper el contrato y la distinción lógica entre las acciones que el programa toma. Pueden introducir errores en su programa. Hacen que sea difícil actualizar y modificar funciones. Cuando se utiliza variables globales como variables en vez de constantes, death awaits you with sharp pointy teeth!
lectura sobre los ámbitos y espacios de nombres en Python http://docs.python.org/ tutorial/classes.html # python-scopes-and-namespaces – jfs