lettura facile

I namespace in Python

Quando scrivi un programma utilizzi delle etichette, o nomi, per riferirti a delle cose come variabili o funzioni. Il "Namespace" è il contenitore in cui sono memorizzati tutti i nomi delle etichette che hai usato in un programma o in una sessione nel linguaggio di programmazione Python.

In breve, il "namespace" aiuta Python a mantenere l'ordine il codice, facendo in modo che ogni nome possa essere trovato rapidamente e in modo inequivocabile.

Ci sono tre tipi principali di "namespace" in Python:

  • Built-in
    Questi sono i nomi che sono integrati in Python e sono sempre disponibili. Ad esempio, `print()` e `len()` sono funzioni built-in.
  • Globale
    Questi nomi sono definiti al livello più alto del codice, fuori da qualsiasi funzione o classe, e sono accessibili da qualsiasi parte del tuo programma.
  • Locale
    Questi nomi sono definiti all'interno di una funzione o di un blocco di codice e sono accessibili solo all'interno di quella funzione o di quel blocco. Questo namespace include anche il namespace Enclosed.

Quando usi un nome nel tuo programma, Python segue delle regole per decidere da quale "namespace" prendere il valore. Questo processo è noto come "risoluzione dei nomi".

Ricorda che Python cerca i nomi prima nel local namespace, poi nel global namespace, e infine nel built-in namespace. Questo meccanismo di ricerca, noto come "LEGB Rule" (Local, Enclosed, Global, Built-in), aiuta a prevenire conflitti di nomi e a mantenere il codice organizzato.

Poiché una stessa etichetta può essere usata in vari namespace,  a ogni etichetta viene associato uno "scope" per indicare la sua origine. Questa informazione dice a Python dove iniziare a cercare. 

Ad esempio, se una variabile si trova all'interno di una funzione, il suo "scope" è locale a quella funzione. Quindi, non puoi usarla al di fuori della funzione. Viceversa, una variabile globale può essere letta da ogni parte del programma.

Facciamo un esempio semplice in Python per illustrare questi concetti.

Prima di tutto, definiamo una variabile globale chiamata `numero` e le assegniamo il valore `5`.

Questa è una variabile globale ed è accessibile da ogni parte del programma.

numero = 5

Poi definiamo una funzione chiamata `esempio_funzione`.

All'interno di questa funzione, definiamo una variabile anch'essa chiamata `numero` ma con valore `10`.

Quest'ultima è una variabile locale ed è accessibile solo all'interno della funzione.

numero = 5
def esempio_funzione():
     numero = 10
     print("Numero interno alla funzione:", numero)
print("Numero globale prima della chiamata alla funzione:", numero)
esempio_funzione()
print("Numero globale dopo la chiamata alla funzione:", numero)

In questo programma ci sono due variabili che hanno lo stesso nome "numero".

  1. La prima variabile ha uno scope globale
  2. La seconda variabile, quella che si trova dentro la funzione, ha uno scope locale.

Le istruzioni print(), invece, sono etichette che si trovano nel namespace built-in di Python, ovvero sono predefinite nel linguaggio.

Qual è il risultato in output?

Quando stampiamo il valore della variabile "numero" al di fuori della funzione, Python usa il valore della variabile globale `numero`, quindi vedremo stampato il numero `5`.

Numero globale prima della chiamata alla funzione: 5

All'interno della funzione, invece, Python usa il valore della variabile locale `numero`.

Quindi vedremo stampato il numero `10`.

Numero interno alla funzione: 10

Dopo la chiamata della funzione, infine, Python usa nuovamente il valore della variabile globale.

Quindi vedremo ancora una volta stampato il numero `5`.

Numero globale dopo la chiamata alla funzione: 5

L'esempio mostra come il "scope" di una variabile, ovvero dove il nome è valido e cosa rappresenta, può cambiare in base a dove il nome è definito nel codice.

In conclusione, Python "risolve" il nome "numero" guardando prima all'interno dello "scope" corrente e, se non lo trova, cerca negli "scope" più esterni fino a raggiungere il livello globale o built-in.

Questo semplice esempio dovrebbe averti aiutato a capire cosa sono i namespace e lo scope nel linguaggio Python.




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




FacebookTwitterLinkedinLinkedin