Python Language Variabili globali


Esempio

In Python, le variabili all'interno delle funzioni sono considerate locali se e solo se compaiono nella parte sinistra di un'istruzione di assegnazione, o qualche altra occorrenza di associazione; in caso contrario tale associazione viene cercata nel racchiudere le funzioni, fino allo scopo globale. Questo è vero anche se l'istruzione di assegnazione non viene mai eseguita.

x = 'Hi'

def read_x():
    print(x)   # x is just referenced, therefore assumed global

read_x()       # prints Hi

def read_y():
    print(y)   # here y is just referenced, therefore assumed global

read_y()       # NameError: global name 'y' is not defined

def read_y():
    y = 'Hey'  # y appears in an assignment, therefore it's local
    print(y)   # will find the local y

read_y()       # prints Hey

def read_x_local_fail():
    if False:
        x = 'Hey'  # x appears in an assignment, therefore it's local
    print(x)   # will look for the _local_ z, which is not assigned, and will not be found

read_x_local_fail()   # UnboundLocalError: local variable 'x' referenced before assignment

Normalmente, un'assegnazione all'interno di un oscilloscopio ombreggia qualsiasi variabile esterna con lo stesso nome:

x = 'Hi'

def change_local_x():
    x = 'Bye'
    print(x)
change_local_x()  # prints Bye
print(x)  # prints Hi

Dichiarare un nome global significa che, per il resto dello scope, qualsiasi assegnazione al nome avverrà al livello principale del modulo:

x = 'Hi'

def change_global_x():
    global x
    x = 'Bye'
    print(x)

change_global_x()  # prints Bye
print(x)  # prints Bye

La parola chiave global indica che gli assegnamenti avverranno al livello più alto del modulo, non al livello principale del programma. Altri moduli avranno ancora bisogno del solito accesso puntato alle variabili all'interno del modulo.

Riassumendo: per sapere se una variabile x è locale a una funzione, dovresti leggere l' intera funzione:

  1. se hai trovato global x , x è una variabile globale
  2. Se hai trovato nonlocal x , x appartiene a una funzione di inclusione e non è né locale né globale
  3. Se hai trovato x = 5 o for x in range(3) o qualche altro legame, allora x è una variabile locale
  4. Altrimenti x appartiene ad un ambito che racchiude (scope della funzione, scope globale o builtin)