2012-03-30 6 views
6

Tengo una variable global que estoy usando como variable predeterminada. Dependiendo de lo que ocurra en mi programa, necesito la capacidad de cambiar esos valores predeterminados y que los cambios persistan a través de la operación restante de mi código. Los quiero cambiados y definidos en todas partes, por lo tanto, utilicé una variable global. Aquí hay un código de prueba que muestra cómo estoy tratando de modificar estas variables.Confusión de variables globales en python

Cuando hago esto tengo el siguiente problema ...

  1. El programa piensa que myGlobal no se ha definido en la principal. Pero tiene. ¿Por qué?
  2. Cuando llamo a una subrutina después de haber cambiado myGlobal. No quería que eso sucediera.

¿Cuál es la forma correcta de lograr lo que estoy tratando de hacer aquí? ¿Ejemplos?

#!/usr/bin/python 

import sys 

myGlobal = "foo" 

print "********************" 
print "MyGlobal %s" % myGlobal 
print "********************" 


def main(argv): 

    #UnboundLocalError: local variable 'myGlobal' referenced before assignment 
    print '1. Printing the global again: ' + myGlobal 

    myGlobal = "bar" 
    print "2. Change the global and print again: " + myGlobal 

    # now call a subroutine 
    mySub() 

# Checks for output file, if it doesn't exist creates one 
def mySub(): 
    # Why isn't the global "bar" not "foo"? 
    print '3. Printing the global again: ' + myGlobal 

    myGlobal = "black sheep" 
    print "4. Change the global and print again: " + myGlobal 




if __name__ == "__main__": 
    main(sys.argv[1:]) 

Respuesta

8

Si desea asignar que, en lugar de leer una variable de módulo global dentro de una función, es necesario el global palabra clave:

def main(argv): 
    global myGlobal 
    #... 
    myGlobal = "bar" 

lo contrario, la asignación se acaba de crear una nueva variable local que sombrea su variable global (por lo que los cambios a la misma no afectarán a la variable global, como es el caso en su ejemplo).

Dicho esto, también se puede utilizar una clase aquí para tener su cuota de las funciones de estado de una manera más agradable:

class MyApp(object): 
    def main(self, argv): 
    self.myVar = "bar" 
    self.mySub() 

    def mySub(self): 
    print self.myVar 

MyApp().main(sys.argv[1:]) 
2

Lo que se busca es la global statement en Python. Inserta global myGlobal antes de tus bloques de código en main y mySub y tienes un comportamiento predecible. Habiendo dicho eso, si tiene que pasar información de estado entre funciones, use argumentos para la función. Eso es mucho más limpio.