lettura facile

Namespace locale in Python

In Python, un "namespace locale" è un ambiente che contiene i nomi (come variabili, funzioni, classi, ecc.) che sono definiti in una funzione, un oggetto o in un blocco di codice specifico.

Perché è detto locale? Questo ambiente è detto "locale" perché esiste e ha significato solo all'interno della funzione in cui è stato definito. All'esterno di questo ambiente, questi nomi non sono né riconosciuti né accessibili. Lo stesso avviene nei metodi, nelle classi e nelle list comprehension. Il namespace locale è uno dei vari namespace di Python.

Quando esegui una funzione, Python crea un namespace locale per essa. Questo significa che tutte le variabili assegnate all'interno della funzione vivono in questo spazio isolato.

Se cerchi di accedere al nome di una variabile definita all'interno di una funzione da un'altra funzione o dal livello globale del tuo programma, Python ti dirà che non conosce quel nome.

Al termine dell'esecuzione della funzione, Python cancella il namespace locale.

In altre parole, tutte le variabili definite all'interno di una funzione sono isolate e protette da accessi esterni, rendendo le funzioni come piccole scatole che nascondono i loro dettagli interni al mondo esterno.

Facciamo un esempio pratico per illustrare come funziona il namespace locale in Python.

Immagina di voler scrivere un programma che calcola il quadrato di un numero e poi usa questo risultato per fare un'ulteriore operazione.

def calcola_quadrato(numero):
    risultato = numero ** 2
    return risultato

numero = 4
y=calcola_quadrato(numero)
print(y)

In questo esempio, la funzione calcola_quadrato() prende un numero come input, calcola il suo quadrato, e lo restituisce.

La variabile `risultato` è definita all'interno della funzione calcola_quadrato(), il che significa che esiste soltanto nel namespace locale di quella funzione. E' una variabile locale.

Quando la funzione termina l'esecuzione, il suo namespace locale viene distrutto, e tutte le variabili al suo interno cessano di esistere per il resto del programma.

16

La variabile `numero`, invece, è una variabile del namespace globale perché è definita nel top-main dello script.

Questo semplice esempio mostra come Python gestisce i namespace locali.

Il caso delle funzioni ricorsive

Nel caso particolare delle funzioni ricorsive Python crea un namespace locale per ogni funzione ricorsiva.

In questo modo, ogni funzione accede alle proprie variabili locali senza interferire con gli altri namespace.

Cos'è una funzione ricorsiva? Una funzione ricorsiva è una funzione che si chiama (o invoca) se stessa durante la sua esecuzione. La ricorsione può essere molto efficace per risolvere problemi che possono essere suddivisi in sottoproblemi di natura simile.

Un classico esempio di funzione ricorsiva è quella che calcola il fattoriale di un numero (n!).

def fattoriale(n):
     # Caso base: se n è 0, il fattoriale è 1
     if n == 0:
          return 1
     # Passo ricorsivo: n! = n * (n-1)!
     else:
          return n * fattoriale(n-1)

# Esempio di utilizzo della funzione
num = 5
print(f"Il fattoriale di {num} è: {fattoriale(num)}")

La ricorsione avviene tramite una serie di chiamate a funzioni annidate, ognuna con un valore di 'n' decrescente, fino a raggiungere 0, dopodiché le chiamate iniziano a "ritornare" i loro risultati fino alla chiamata originale.

In ogni chiamata Python crea un namespace locale apposito in cui la variabile 'n' ha un valore diverso.

Man mano che le funzioni terminano, Python cancella il namespace locale della funzione, e alla fine restituisce il risultato finale.

Il fattoriale di 5 è: 120

In questo caso il risultato è 120 perché il fattoriale di 5! è il prodotto 5·4·3·2·1=120

La funzione locals()

la funzione locals() restituisce un dizionario che rappresenta la tabella dei simboli del namespace locale corrente.

print(locals())

Se invochi locals() all'interno di una funzione, questa ti restituirà tutte le variabili che sono state definite in quella funzione.

Questo strumento è molto utile per il debug e l'introspezione, poiché permette di vedere quali variabili sono accessibili in un dato punto del programma e quali valori hanno.

Se chiami la funzione locals() al livello più alto di un modulo, ovvero non all'interno di una funzione ma nel cosiddetto "top-level" del modulo, allora ti restituisce il dizionario del namespace globale del modulo.

Un'altra funzione che restituisce il namespace locale è la funzione vars()

print(vars())

Anche questa funzione restituisce il namespace locale sotto forma di dizionario.




Se qualcosa non ti è chiaro, scrivi la tua domanda nei commenti.




FacebookTwitterLinkedinLinkedin