2012-12-14 14 views
13

Che cos'è una dichiarazione globale ? E come viene usato? Ho letto Python's official definition;
tuttavia, non ha molto senso per me.In Python che cos'è una dichiarazione globale?

+3

solo un commento, 2.4 è una vecchia versione di python, il riferimento effettivo per [python 2.X versione è qui] (http://docs.python.org/2/reference/simple_stmts.html#global) –

+2

Python 3 viene fornito con la nuova istruzione 'nonlocal' insieme a' global', vedi anche tu. –

+0

@TahaJahangir - Questo è un buon punto. Ho anche aggiunto un po 'di confusione a 'nonlocal' nella mia risposta a causa del tuo commento. Grazie! – mgilson

risposta

31

Ogni "variabile" in Python è limitata ad un certo ambito. L'ambito di un "file" python è l'ambito modulo. Si consideri il seguente:

#file test.py 
myvariable = 5 # myvariable has module-level scope 

def func(): 
    x = 3  # x has "local" or function level scope. 

oggetti con ambito locale muoiono non appena la funzione termina e non può mai essere recuperate (a meno che non return loro), ma all'interno di una funzione, è possibile accedere alle variabili del perimetro livello del modulo (o qualsiasi ambito che contiene):

myvariable = 5 
def func(): 
    print(myvariable) # prints 5 

def func2(): 
    x = 3 
    def func3(): 
     print(x)  # will print 3 because it picks it up from `func2`'s scope 

    func3() 

Tuttavia, non è possibile utilizzare l'assegnazione su quella di riferimento e si aspettano che sarà propagato a un ambito esterno:

myvariable = 5 
def func(): 
    myvariable = 6  # creates a new "local" variable. 
         # Doesn't affect the global version 
    print(myvariable) # prints 6 

func() 
print(myvariable)  # prints 5 

Ora, siamo finalmente a global. La parola chiave global è il modo in cui si dice a python che una particolare variabile nella propria funzione è definita a livello globale (a livello di modulo).

myvariable = 5 
def func(): 
    global myvariable 
    myvariable = 6 # changes `myvariable` at the global scope 
    print(myvariable) # prints 6 

func() 
print(myvariable) # prints 6 now because we were able 
        # to modify the reference in the function 

In altre parole, è possibile modificare il valore della myvariable nel modulo-scope dall'interno func se si utilizza la parola chiave global.


Per inciso, gli ambiti possono essere nidificate arbitrariamente profondo:

def func1(): 
    x = 3 
    def func2(): 
     print("x=",x,"func2") 
     y = 4 
     def func3(): 
      nonlocal x # try it with nonlocal commented out as well. See the difference. 
      print("x=",x,"func3") 
      print("y=",y,"func3") 
      z = 5 
      print("z=",z,"func3") 
      x = 10 

     func3() 

    func2() 
    print("x=",x,"func1") 

func1() 

Ora, in questo caso, nessuna delle variabili sono dichiarate in ambito globale, e in python2, non c'è (facile/clean) per modificare il valore di x nell'ambito di func1 dall'interno di func3. Ecco perché la parola chiave nonlocal è stata introdotta in python3.x. nonlocal è un'estensione di global che consente di modificare una variabile prelevata da un altro ambito in qualsiasi ambito da cui è stata estratta.

+0

+1 per una spiegazione approfondita. Tuttavia, potresti voler mostrare i risultati delle dichiarazioni di stampa. –

+0

@StevenRumbalski - Fatto. Buon suggerimento – mgilson

+0

Testato da solo dopo aver letto la tua risposta e la mia comprensione è notevolmente migliorata su questo argomento. Grazie mille! – Capurnicus

0

Fondamentalmente dice all'interprete che la variabile data deve essere modificata o assegnata a livello globale, piuttosto che il livello locale predefinito.

0
a = 1 

def f(): 
    a = 2 # doesn't affect global a, this new definition hides it in local scope 

a = 1 

def f(): 
    global a 
    a = 2 # affects global a 
0

È possibile utilizzare una variabile globale in altre funzioni dichiarando come global in ogni funzione che lo modifica

Python vuole assicurarsi che tu non sappia che è quello che si sta giocando con esplicitamente richiedendo la parola chiave globale.

Vedi this answer

1

mgilson ha fatto un buon lavoro ma vorrei aggiungere altro.

list1 = [1] 
list2 = [1] 

def main(): 
    list1.append(3) 
    #list1 = [9] 
    list2 = [222] 

    print list1, list2 


print "before main():", list1, list2 
>>> [1] [1] 
main() 
>>> [1,3] [222] 
print list1, list2  
>>> [1, 3] [1] 

all'interno di una funzione, Python assume ogni variabile come variabile locale a meno che non si dichiara come globale, o si accede a una variabile globale.

list1.append(2) 

era possibile perché si accede alla "lista1" e gli elenchi sono modificabili.

list2 = [222] 

era possibile perché si sta inizializzando una variabile locale.

Tuttavia, se si decommentare # list1 = [9], si otterrà

UnboundLocalError: local variable 'list1' referenced before assignment 

Significa che si sta tentando di inizializzare una nuova variabile locale 'lista1', ma era già fatto riferimento in precedenza, e siete fuori dal campo di applicazione per riassegnarlo.

Per inserire l'ambito, dichiarare "elenco1" come globale.

Si consiglia vivamente di leggere this anche se c'è un errore di battitura alla fine.

Problemi correlati