[Python] Indagine su una variabile.

Massimo Masson max a studiomasson.it
Lun 25 Lug 2022 20:35:21 CEST


Il 25/07/2022 15:20, Gabriele Battaglia ha scritto:
[...]
> Riprendendo il tuo esempio ti chiedo, a cosa serve allora la parola 
> chiave global?
> 
> Se io dichiaro una variabile a livello main, poi la modifico all'interno 
> di una funzione di livello più alto e naturalmente me la aspetto 
> modificata quando esco da queste funzioni, perchè dovrei avere la 
> necessità di dichiarare che quella variabile è global, all'interno delle 
> mie funzioni?
> 
> Non so se sono riuscito a spiegare il mio dubbio.

Provo a dirti la mia, vediamo se siamo sulla stessa lunghezza d'onda...

global serve per consentire di utilizzare una variabile fuori dal suo 
scope (contesto) naturale.

Per quel che so lo si usa o all'interno di una funzione, o per definire 
variabili "globali" tra moduli per scambio informazioni.

Sto sull'uso all'interno di una funzione, penso sia più facile per me da 
spiegare.

Quando entri in una funzione, questa definisce il suo "scope". Le 
variabili definite nella funzione hanno come scope la funzione medesima. 
Quando esci dalla funzione, spariscono.

Se vuoi modificare una variabile definita fuori dalla funzione, allora 
usi la keyword global, così la funzione capisce che lo scope è esterno a 
se' stessa, e si vuole usare la variabile "esterna" e non quella della 
funzione.

Nota che se ad una variabile assegni un valore nel corpo della funzione 
python assume sia locale (a meno che non la dichiari global).
Le variabili solo referenziate all'interno di una funzione invece sono 
implicitamente global.
Un esempio aiuta:

m = 1

def duplica():
     global m
     m = m * 2
     print(m)

duplica()

Ti restituisce il valore 2.
Se provi a togliere la riga "global m" ottieni... un errore:
local variable 'm' referenced before assignment.
Questo perché hai usato la variabile prima di "dichiararla".
Nota che se sostiuissi "global m" con "m = 7" (ad esempio) non avresti 
più l'errore, la stampa di "m dentro duplica" darebbe 14, la stampa di 
"m fuori duplica" darebbe... ancora 1 (la "m" esterna alla funzione).

Ovvero, la variabile definita dentro la funzione "oscura" la variabile 
esterna alla funzione, a meno che non la dichiari global, ed in tal caso 
anche dentro la funzione utilizzi la variabile esterna (appunto, globale).

Aiuta?

Ciao,
m.


Maggiori informazioni sulla lista Python