Salta ai contenuti
Manuale LogoManuale Logo

Scope delle variabili

Una variabile x definita dentro una funzione esiste solo in quella funzione. Fuori da lì non è accessibile.

Questa zona del programma si chiama scope (o “ambito”).

Una variabile creata dentro una funzione è locale: esiste durante l’esecuzione della funzione e non è accessibile fuori dal suo scope.

def mia_funzione():
x = 10 # variabile locale: esiste solo dentro questa funzione
print(x)
mia_funzione() # 10
# print(x) # NameError: 'x' non esiste qui fuori!

È un comportamento voluto: le funzioni restano indipendenti e le loro variabili non interferiscono con quelle esterne.

Una variabile definita fuori da ogni funzione è globale: può essere letta dalla parte principale del programma e dalle funzioni, salvo variabili locali con lo stesso nome.

nome = "Alice" # variabile globale
def saluta():
print(f"Ciao, {nome}!") # può leggere la variabile globale
saluta() # Ciao, Alice!

Puoi leggere le variabili globali, ma non modificarle (di solito)

Sezione intitolata “Puoi leggere le variabili globali, ma non modificarle (di solito)”

Una funzione può leggere una variabile globale. Se assegna un nuovo valore allo stesso nome, però, Python lo considera locale:

contatore = 0
def incrementa():
contatore = 1 # ATTENZIONE: crea una variabile locale, non modifica quella globale!
print(f"Dentro la funzione: {contatore}")
incrementa()
print(f"Fuori dalla funzione: {contatore}") # ancora 0, non è cambiato!

Per modificare la variabile globale dall’interno della funzione devi usare global:

contatore = 0
def incrementa():
global contatore # ora si riferisce alla variabile globale
contatore += 1
incrementa()
incrementa()
print(contatore) # 2

Se hai una variabile locale e una globale con lo stesso nome, dentro la funzione vince quella locale:

x = "globale"
def funzione():
x = "locale"
print(x) # locale: la variabile locale ha la precedenza
funzione()
print(x) # globale: fuori dalla funzione, x è ancora quella globale

Non vengono confuse: sono due variabili separate che condividono solo il nome.

Funzioni come print, len, range, input sono sempre disponibili ovunque nel codice. Python le cerca per ultime, ma le trova sempre.

Per questo non dovresti mai chiamare una tua variabile print o list: sovrascriveresti la funzione predefinita e poi non potresti più usarla!

# Da non fare mai!
# list = [1, 2, 3]: ora non puoi più usare list() come funzione
# print = "ciao": ora print() non funziona più!