Video Corso Base di Python 3

12: Variabili Globali e Variabili Locali

Menu della Serie






Ciao a tutti ragazzi e ragazze, benvenuti a questa dodicesima puntata della serie dedicata alle basi di Python 3.6

Fin'ora abbiamo detto che possiamo immaginare le variabili come delle scatole in cui depositiamo dei valori.
Possiamo quindi richiamare e modificare questo valore utilizzando il nome della variabile.

x = 3
x += 1
x
4

Abbiamo inoltre parlato di funzioni, e abbiamo visto che anche qui possiamo e siamo incoraggiati ad utilizzare le variabili: si tratta di uno degli elementi indispensabili di Python e della programmazione in generale.

Ma fino a dove ci possiamo spingere nell'utilizzo delle variabili? Fino a che punto è davvero possibile utilizzarle e modificarle nei nostri programmi?

Per rispondere a queste domande andremo ora ad approfondire il tema parlando di Variabili Globali e Variabili Locali.

Partiamo da un esempio sull'editor testuale.

x = 15
def funzione_esempio():
return(x)
print(funzione_esempio())

>>>15

La nostra funzione esempio ci restituisce quindi il valore assegnato alla variabile x.

Proviamo peró ora a modificare leggermente la nostra funzione... diciamo che vogliamo aggiungere 2 al 15 presente in "x".

x = 15
def funzione_esempio():
x += 2
return(x)
print(funzione_esempio())

>>>UnboundLocalError: local variable 'x' referenced before assignment

Come mai abbiamo ottenuto questo errore? Python ci informa del fatto che ci stiamo riferendo a una variabile prima di averla dichiarata e assegnata... eppure nell'esempio precedente tutto ha funzionato a meraviglia e la variabile x è proprio li!

La chiave di lettura di questo comportamento apparentemente bizzarro è la seguente, prestate attenzione:
In Python il codice e quindi anche le variabili, possono essere salvati in due ambienti diversi, l'ambito Locale e l'ambito Globale, chiamati in inglese Global Scope e Local Scope.

Potete pensare a questi due ambienti come a dei contenitori distinti in cui vengono definite e assegnate le variabili, un contenitore Globale e un contenitore Locale.
Quando uno di questi contenitori viene distrutto, quindi quando uno di questi ambiti viene distrutto, lo stesso accade per i valori delle variabili in esso salvate che vengono quindi dimenticati.




La distinzione tra i due ambiti è la seguente:

Un Ambito Locale viene creato ogni volta che una funzione viene chiamata, e distrutto dopo che la funzione restituisce un valore con return.
È come se ogni volta che una funzione viene processata, Python le fornisse un contenitore e le dicesse: bene, metti le tue variabili e il tuo codice quá dentro.
Le variabili dichiarate all'interno di qualsiasi funzione, quindi dell'ambito locale della funzione, sono chiamate Variabili Locali.
Possono esistere quindi tanti Local Scope quante funzioni abbiamo in esecuzione.

Dall'altro lato invece, esiste e puó esistere un unico Ambito Globale, che viene creato automaticamente da Python all'avvio del programma e distrutto alla chiusura del programma.
È l'ambito principale: tutte le variabili che vengono dichiarate all'esterno di una funzione sono chiamate proprio Variabili Globali, e restano pertanto in vita dall'avvio alla chiusura del programma principale.

È possibile accedere alle Variabili Globali da qualsiasi parte del programma, mentre è possibile accedere alle Variabili Locali solamente dall'ambito locale della funzione in cui sono contenute.
Nel nostro esempio, x è proprio una variabile Globale, e otteniamo un errore perché seppur è vero che un ambito locale puó accedere alle variabili del Global Scope, il loro utilizzo all'interno della funzione è limitato.

Ad esempio per poter modificare il valore di una Variabile Globale dall'interno di una funzione, come abbiamo provato a fare con la nostra x, dobbiamo prima dichiarare alla funzione le nostre intenzioni mediante l'istruzione global.
Andiamo a modificare l'esempio precedente...

x = 15
def funzione_esempio():
global x
x += 2
return(x)
print(funzione_esempio())

>>>17

Ed ecco che ora ci è possibile modificare il valore della variabile x, perché Python sa che ci stiamo riferendo alla x presente nell'ambito Globale!




Un altro modo per poter utilizzare il valore di una Variabile Globale in maniera più complicata all'interno di una funzione è creando una Variabile Locale a cui assegnamo il valore della Variabile Globale...
Potremo quindi poi modificare la nostra nuova Variabile Vocale, aggirando così la limitazione.
Tenete a mente che volendo potete dare a questa nuova Variabile Locale anche lo stesso nome della Globale, perché Python le distinguerà comunque come variabili differenti per via dell'ambito di provenienza.
Per facilitare questo esempio io utilizzeró peró un nome differente:

x = 15
def funzione_esempio():
y = x
y += 2
return(y)
print(funzione_esempio())

>>>17




Come accennato inoltre, al contrario delle Globali, è possibile accedere alle Variabili Locali solamente dall'Ambito Locale della funzione in cui sono contenute, quindi non è possibile accedervi dal global scope o dal local scope di un'altra funzione... otterremo un errore qualora provassimo a forzare questa regola:

Ad esempio:

def mia_funzione():
spam = 24
print(spam)

eggs = spam + 6
print(eggs)
eggs = spam + 6

>>>NameError: name 'spam' is not defined

Potete utilizzare le variabili di una funzione solo se queste ci vengono passate dal return della funzione... ad esempio facciamo una piccola modifica:

def mia_funzione():
spam = 24
return(spam)

eggs = mia_funzione() + 6
print(eggs)

>>>30

Ed ecco che ora possiamo effettuare una somma con spam dall'ambito principale del programma.




È bene imparare la distinzione tra ambito locale e ambito globale perché si tratta di concetti estremamente importanti.
L'esistenza degli ambiti è utilissima ad esempio per ridurre il numero di bug e aumentare la robustezza dei programmi:
Pensate a che caos se in un programma complesso tutte le variabili fossero globali, e per colpa di un errore in una della tante funzioni del programma i valori delle variabili fossero perennemente sballati, causando un crash sistematico.
Inoltre restando in memoria fino alla fine del programma, in programmi complessi le variabili globali sono sinonimo di pesantezza e spreco di risorse.

L'utilizzo di Variabili Locali è quindi estremamente incoraggiato.




Ricapitolando:

-Esistono due ambienti distinti in cui vengono salvati codice e variabili, l'Ambito Locale e l'Ambito Globale;
-L'Ambito Globale è il principale, creato all'avvio del programma e distrutto solo alla sua chiusura;
-Le Variabili definite nell'ambito Globale sono chiamate Variabili Globali;
-L'Ambito Locale è quello interno a una funzione, viene creato quando la funzione è chiamata e distrutto al return;
-Le Variabili definite nell'ambito Locale sono chiamate Variabili Locali;
-È possibile accedere alle Variabili Globali da qualsiasi parte del programma, mentre è possibile accedere alle variabili locali solamente dall'ambito locale della funzione in cui sono contenute;
-L'utilizzo di Variabili Globali è generamente sconsigliato per evitare bug e preservare la robustezza del programma.