2012-03-30 15 views
6

Ho una variabile globale che sto usando come variabile di default. A seconda di cosa succede nel mio programma ho bisogno della possibilità di cambiare quelle impostazioni predefinite e mantenere le modifiche persistenti attraverso l'operazione rimanente del mio codice. Li voglio cambiati e definiti ovunque, quindi ho usato una variabile globale. Ecco un codice di prova che mostra come sto cercando di modificare queste variabili.Confusione di variabili globali in python

Quando faccio questo ho i seguenti problemi ...

  1. Il programma pensa che myGlobal non è stato definito nella principale. Ma ha. Perché?
  2. Quando chiamo una subroutine dopo aver modificato myGlobal. Non volevo che succedesse.

Qual è il modo corretto per realizzare ciò che sto cercando di fare qui? Esempi?

#!/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:]) 

risposta

8

Se si desidera assegnare, piuttosto che leggere una variabile di modulo globale dall'interno di una funzione, è necessario la parola chiave global:

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

In caso contrario, l'assegnazione sarà solo creare una nuova variabile locale che ombreggia la tua variabile globale (quindi le modifiche ad essa non influenzeranno la variabile globale, come nel caso del tuo esempio).

Detto questo, si potrebbe anche usare una classe qui per avere il vostro funzioni Stato Capitale in un modo migliore:

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

    def mySub(self): 
    print self.myVar 

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

Quello che state cercando è il global statement in pitone. Inserisci global myGlobal prima dei codici in main e mySub e lì hai un comportamento prevedibile. Detto questo, se devi passare le informazioni di stato tra le funzioni, usa gli argomenti per la funzione. È molto più ordinato.