
L'istruzione nonlocal in Python
Nel linguaggio Python l'istruzione `nonlocal` ti permette di dichiarare che una variabile non deve essere considerata come una variabile locale di una funzione nidificata.
nonlocal nomevariabile
Quando Python incontra questa istruzione in una funzione associa la variabile all'ambito esterno che contiene la funzione.
Questo ti permette di modificare variabili non locali e influenzare il loro stato al di fuori della funzione.
L'istruzione `nonlocal` si usa soltanto nelle funzioni nidificate, ossia nelle funzioni che richiamano altre funzioni, per fare in modo che una variabile non appartenga né all'ambito locale, né a quello globale. Senza nonlocal, Python creerebbe una nuova variabile locale nella funzione nidificata se si tentasse di assegnarle un valore. Viceversa, con nonlocal, Python modifica la variabile nell'ambito superiore.
Ti faccio un esempio pratico.
In questo script ci sono due funzioni nidificate.
def esterna():
var = "valore esterno"
def interna():
nonlocal var
var = "valore modificato"
interna()
print(var)
esterna()
La funzione interna() modifica il valore della variabile `var` definita nella funzione esterna() grazie all'utilizzo di nonlocal.
Senza nonlocal, la modifica del valore di `var` all'interno di interna() avrebbe portato alla creazione di una nuova variabile locale all'interno della funzione interna(), lasciando inalterata la variabile nell'ambito di esterna().
Quindi, il risultato finale è il seguente
valore modificato
Ricorda che l'istruzione `nonlocal` non può essere utilizzata per variabili globali o in funzioni che non sono nidificate all'interno di altre funzioni.
Inoltre, la variabile dichiarata con `nonlocal` deve già esistere nell'ambito esterno al momento della dichiarazione, ma non nell'ambito locale.
Quando Python non trova la variabile dichiarata negli ambiti superiori, restituisce un messaggio di errore.
Ad esempio, in questo script la variabile `var` è definita nell'ambito globale. In questo caso Python restituisce un errore perché non la trova negli ambiti superiori della variabile nidificata.
def esterna():
def interna():
nonlocal var
var = "valore modificato"
interna()
var = "valore esterno"
esterna()
print(var)
SyntaxError: no binding for nonlocal 'var' found
In questo caso devi usare l'istruzione global per utilizzare la variabile `var` come una variabile globale.
def esterna():
def interna():
global var
var = "valore modificato"
interna()
var = "valore esterno"
esterna()
print(var)
valore modificato