Usare le variabili globali in una funzione

Come posso creare o usare una variabile globale in una funzione?

Se creo una variabile globale in una funzione, come posso usare questa variabile globale in un'altra funzione? Devo memorizzare la variabile globale in una variabile locale della funzione che ha bisogno del suo accesso?

Soluzione

Potete usare una variabile globale in altre funzioni dichiarandola come globale in ogni funzione che la assegna:

globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1

Immagino che la ragione sia che, dato che le variabili globali sono così pericolose, Python vuole assicurarsi che voi sappiate davvero che è quello con cui state giocando, richiedendo esplicitamente la parola chiave global.

Vedi altre risposte se vuoi condividere una variabile globale attraverso i moduli.

Commentari (13)

Potreste voler esplorare la nozione di namespace. In Python, il modulo è il luogo naturale per i dati globali:

Ogni modulo ha la sua tabella dei simboli privata, che è usata come tabella globale dei simboli da tutte le funzioni definite nel modulo. Così, l'autore di un modulo può usare variabili globali nel modulo senza preoccuparsi di scontri accidentali con le variabili globali di un utente. D'altra parte, se sapete cosa state facendo potete toccare le variabili globali di un modulo con la stessa notazione usata per riferirsi alle sue funzioni, modname.itemname.

Un uso specifico di global-in-a-module è descritto qui - Come posso condividere le variabili globali tra i moduli?, e per completezza il contenuto è condiviso qui:

Il modo canonico per condividere informazioni attraverso i moduli all'interno di un singolo programma è quello di creare uno speciale modulo di configurazione (spesso chiamato config o cfg). Basta importare il modulo di configurazione in tutti i moduli della vostra applicazione; il modulo diventa quindi disponibile come nome globale. Poiché c'è solo un'istanza di ogni modulo, qualsiasi cambiamento fatto all'oggetto modulo si riflette ovunque. Per esempio:

File: config.py

x = 0 # Valore predefinito dell'impostazione di configurazione 'x'

File: mod.py

importa config config.x = 1

File: main.py

importare config importare mod stampa config.x

Commentari (2)

Se volete fare riferimento a una variabile globale in una funzione, potete usare la parola chiave global per dichiarare quali variabili sono globali. Non è necessario usarla in tutti i casi (come qualcuno qui sostiene erroneamente) - se il nome a cui si fa riferimento in un'espressione non può essere trovato nell'ambito locale o negli ambiti delle funzioni in cui questa funzione è definita, viene cercato tra le variabili globali.

Tuttavia, se si assegna a una nuova variabile non dichiarata come globale nella funzione, essa è implicitamente dichiarata come locale, e può mettere in ombra qualsiasi variabile globale esistente con lo stesso nome.

Inoltre, le variabili globali sono utili, contrariamente ad alcuni fanatici OOP che sostengono il contrario - specialmente per gli script più piccoli, dove OOP è eccessivo.

Commentari (1)