
Lo scope in Python
Oggi parliamo dello "scope" in Python.
Lo "scope" di una variabile determina in quale parte del tuo programma quella variabile può essere vista o utilizzata.
Quando Python incontra un'etichetta avvia un'operazione di risoluzione del nome per individuare l'oggetto a cui si riferisce. Gli scope sono diverse aree in cui può effettuare questa ricerca.
Python gestisce lo scope attraverso alcune regole ben definite tramite un principio chiamato LEGB, che sta per Local, Enclosing, Global, Built-in:
- Local (L)
Questo è lo scope più interno. Le variabili definite all'interno di una funzione sono locali a quella funzione e non possono essere accessibili dall'esterno. - Enclosing (E)
Si riferisce allo scope di funzioni 'incluso' dentro altre funzioni. Una variabile in questo scope è accessibile in una funzione interna, ma non al di fuori delle funzioni che la racchiudono. - Global (G)
Queste sono le variabili definite al livello più alto del modulo Python o esplicitamente dichiarate globali usando la parola chiave `global`. - Built-in (B)
Questo è lo scope che contiene le funzioni built-in di Python; è praticamente globale in ogni modulo Python.
Facciamo degli esempi per chiarire meglio.
Esempio di scope locale
La variabile è "variabile_locale" accessibile solo all'interno della funzione.
def mia_funzione():
variabile_locale = "Sono visibile solo dentro la funzione."
print(variabile_locale)
mia_funzione()
Sono visibile solo dentro la funzione.
Se provassi a chiamare la variabile "variabile_locale" in altri punti del programma, al di fuori della funzione, questo causerebbe un errore perché non è definita in questi scope.
Esempio di global scope
In questo script la variabile "variabile_globale" ha un scope globale.
variabile_globale = "Sono visibile in tutto il programma."
def mia_funzione():
print(variabile_globale)
mia_funzione()
Sono visibile in tutto il programma.
Questo vuol dire che la variabile è visibile in tutto il programma, anche dentro le funzioni.
A differenza della variabile locale, una variabile con scope globale può essere modificata da qualsiasi parte del programma.
variabile_globale = "Originale"
def cambia_globale():
global variabile_globale
variabile_globale = "Modificata"
print(variabile_globale)
cambia_globale()
print(variabile_globale)
Esempio di enclosing scope
L'enclosing scope si riferisce allo scope che circonda (o "incapsula") un ambito locale in una funzione nidificata.
È lo scope che si trova tra lo scope locale e quello globale, accessibile dalle funzioni interne ma non dall'esterno della funzione contenitore.
In pratica, permette alle funzioni annidate di accedere alle variabili non locali della funzione "madre" in cui sono definite.
Ad esempio, in questo script sono presenti due funzioni nidificate.
def funzione_esterna():
variabile_enclosing = "Visibile nella funzione interna."
def funzione_interna():
print(variabile_enclosing)
funzione_interna()
funzione_esterna()
La funzione esterna (madre) chiama la funzione interna e quest'ultima può accedere a tutte le variabili della funzione madre.
In questo caso la funzione esterna stampa il contenuto della variabile "variabile_enclosing".
Visibile nella funzione interna.
Esempio di scope built-in
Gli scope Built-in in Python si riferiscono a un livello di scope che contiene nomi di funzioni, parole chiave e variabili predefinite integrate nel linguaggio Python stesso.
Questi sono accessibili da qualsiasi parte del tuo codice senza doverli importare o definirli esplicitamente.
Ecco un semplice esempio:
mia_lista = [1, 2, 3, 4, 5]
lunghezza_lista = len(mia_lista)
print(lunghezza_lista)
In questo script uilizziamo la funzione built-in len() per ottenere la lunghezza di una lista.
Poi utilizziamo la funzione built-in print() per stampare un valore
5
In questo esempio, sia `len()` che `print()` sono funzioni built-in di Python. Non hai bisogno di importarle da alcun modulo per usarle; sono sempre disponibili ovunque nel tuo codice. Questo è un ottimo esempio di come lo scope built-in funzioni in Python.
Questi esempi illustrano come Python gestisce lo "scope" delle variabili.
Conoscere bene queste regole è fondamentale per scrivere codice chiaro e per evitare errori legati alla visibilità delle variabili.