lettura facile

Namespace globale in Python

Parliamo del concetto di "namespace globale" in Python. Il namespace globale è l'area di memoria che contiene tutti i nomi definiti a livello del modulo (file script). 

Cos'è un namspace? Il concetto di namespace è fondamentale per organizzare e gestire le variabili nel tuo codice Python. Ti aiuta a capire dove si trovano le variabili e come sono accessibili.

Ogni volta che definisci una variabile, al di fuori di qualsiasi funzione o classe, questa risiede nel namespace globale. Le variabili presenti dentro una funzione, invece, sono memorizzate in un altro namespace detto namespace locale.

Tutti gli elementi del namespace globale si trovano nel livello alto del modulo (top-level) e sono accessibili da qualsiasi parte del tuo programma, a meno che non vengano oscurati da un altro namespace più specifico, come quello locale di una funzione.

In altre parole, puoi usare le variabili e le funzioni definite a livello globale ovunque nel tuo modulo. Tuttavia, se crei una variabile con lo stesso nome all'interno di una funzione, questa "nasconderà" quella globale ma solo all'interno di quella funzione.

Facciamo un esempio pratico.

Immagina di avere un programma semplice in Python:

# Questa è una variabile globale
numero = 7
def moltiplica_per_numero(x):
   # x è una variabile locale alla funzione
   return x * numero

risultato = moltiplica_per_numero(3)
print(risultato)

Nel nostro esempio, `numero` è una variabile nel namespace globale ossia una variabile globale.

La funzione moltiplica_per_numero() può accedere alla variabile `numero` perché è all'interno dello stesso namespace.

La variabile `x`, invece, è una variabile locale perché si trova nel namespace locale della funzione ed è accessibile soltanto quando la funzione viene chiamata.

Cosa succede con le variabili globali modificate all'interno delle funzioni?

Se provi a modificare una variabile globale all'interno di una funzione senza dichiararla come `global`, Python penserà che tu stia cercando di creare una nuova variabile locale con lo stesso nome.

Ecco un esempio:

numero = 7
def cambia_numero():
    # Questo tenterà di creare una variabile locale 'numero', non modifica quella globale
    numero = 42

cambia_numero()
print(numero) 

Questo script stampa 7, non 42.

Questo accade perché la funzione print() si trova al di fuori della funzione locale, quindi accede al namespace globale.

7

Per modificare effettivamente la variabile globale all'interno della funzione, dovresti usare la funzione `global` così:

numero = 7
def cambia_numero():
    global numero
    numero = 42

cambia_numero()
print(numero)

Con la parola chiave `global`, stai dicendo a Python di considerare la variabile appartenente al namespace globale.

In questo case la variabile `numero` dentro la funzione viene trattata come una variabile globale e non più locale.

Quindi, il risultato finale dello script è 42.

42

Come visualizzare il contenuto del namespace globale?

Per vedere quali nomi ed etichette si trovano nel namespace globale puoi usare la funzione globals()

La funzione globals() restituisce un dizionario che rappresenta il namespace globale corrente.

Ad esempio, digita questo comando:

print(globals())

Python ti restituisce un dizionario con tutti i nomi delle etichette usate nella sessione o nello script.

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fb5419b7c10>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/main.py', '__cached__': None, 'numero': 42, 'cambia_numero': <function cambia_numero at 0x7fb541a13d90>}

Questo ti permette non solo di visualizzare l'elenco delle etichette del namespace globale ma anche di modificarne i valori come faresti in un dizionario.

L'attributo __dict__ del modulo

Ogni modulo ha il suo namespace e, in generale, puoi accedere al contenuto di un namespace globale anche utilizzando l'attributo __dict__

Ecco un esempio

import math
print('sin' in math.__dict__)

Python legge se nel dizionario del modulo math è presente una funzione chiamata 'sin', la trova e stampa True

True

Visualizzando il contenuto dell'attributo __dict__ puoi vedere tutte le altre etichette presenti nel namespace.

Questo ti permette di accedere alle etichette presenti nel modulo sia usando la sintassi modulo.etichetta e sia attraverso il dizionario modulo__dict__

Ad esempio, dopo aver importato la Math puoi stampare il seno di un numero in due modi:

import math
print(math.__dict__['sin'](1))

oppure

importh math
print(sin(1))

In entrambi i casi il risultato è lo stesso

0.8414709848078965




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




FacebookTwitterLinkedinLinkedin