Spazio dei nomi Python e ambito di una variabile

In questo tutorial imparerai a conoscere lo spazio dei nomi, la mappatura dai nomi agli oggetti e l'ambito di una variabile.

Cos'è il nome in Python?

Se hai mai letto "The Zen of Python" (digita import thisnell'interprete Python), l'ultima riga afferma che gli spazi dei nomi sono una grande idea - facciamene di più! Allora cosa sono questi misteriosi spazi dei nomi? Diamo prima un'occhiata a che nome è.

Il nome (chiamato anche identificatore) è semplicemente un nome dato agli oggetti. Tutto in Python è un oggetto. Il nome è un modo per accedere all'oggetto sottostante.

Ad esempio, quando eseguiamo l'assegnazione a = 2, 2è un oggetto archiviato in memoria e a è il nome a cui lo associamo. Possiamo ottenere l'indirizzo (in RAM) di un oggetto tramite la funzione integrata id(). Diamo un'occhiata a come usarlo.

 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))

Produzione

 id (2) = 9302208 id (a) = 9302208

Qui, entrambi si riferiscono allo stesso oggetto 2, quindi hanno lo stesso id(). Rendiamo le cose un po 'più interessanti.

 # Note: You may get different values for the id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))

Produzione

 id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208

Cosa sta succedendo nella sequenza di passaggi sopra? Usiamo un diagramma per spiegare questo:

Diagramma di memoria delle variabili in Python

Inizialmente, 2viene creato un oggetto e il nome a è associato ad esso, quando lo facciamo a = a+1, 3viene creato un nuovo oggetto e ora a è associato a questo oggetto.

Nota che id(a)e id(3)hanno gli stessi valori.

Inoltre, quando b = 2viene eseguito, il nuovo nome b viene associato all'oggetto precedente 2.

Ciò è efficiente in quanto Python non deve creare un nuovo oggetto duplicato. Questa natura dinamica dell'associazione di nomi rende Python potente; un nome potrebbe riferirsi a qualsiasi tipo di oggetto.

 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)

Tutti questi sono validi e un farà riferimento a tre diversi tipi di oggetti in casi diversi. Anche le funzioni sono oggetti, quindi anche un nome può fare riferimento ad esse.

 def printHello(): print("Hello") a = printHello a()

Produzione

 Ciao

Lo stesso nome a può riferirsi a una funzione e possiamo chiamare la funzione usando questo nome.

Cos'è uno spazio dei nomi in Python?

Ora che abbiamo capito cosa sono i nomi, possiamo passare al concetto di spazi dei nomi.

Per dirla semplicemente, uno spazio dei nomi è una raccolta di nomi.

In Python, puoi immaginare uno spazio dei nomi come una mappatura di ogni nome che hai definito per gli oggetti corrispondenti.

Spazi dei nomi diversi possono coesistere in un dato momento ma sono completamente isolati.

Uno spazio dei nomi contenente tutti i nomi incorporati viene creato all'avvio dell'interprete Python ed esiste finché l'interprete è in esecuzione.

Questo è il motivo per cui funzioni integrate come id(), print()ecc. Sono sempre disponibili da qualsiasi parte del programma. Ogni modulo crea il proprio spazio dei nomi globale.

Questi diversi spazi dei nomi sono isolati. Quindi, lo stesso nome che può esistere in diversi moduli non entra in collisione.

I moduli possono avere varie funzioni e classi. Quando viene chiamata una funzione, viene creato uno spazio dei nomi locale, che contiene tutti i nomi definiti. Simile, è il caso della classe. Il diagramma seguente può aiutare a chiarire questo concetto.

Un diagramma di diversi spazi dei nomi in Python

Ambito delle variabili Python

Sebbene siano definiti vari spazi dei nomi univoci, potremmo non essere in grado di accedervi tutti da ogni parte del programma. Entra in gioco il concetto di ambito.

Un ambito è la parte di un programma da cui è possibile accedere direttamente a uno spazio dei nomi senza alcun prefisso.

In un dato momento, ci sono almeno tre ambiti nidificati.

  1. Ambito della funzione corrente che ha nomi locali
  2. Ambito del modulo che ha nomi globali
  3. L'ambito più esterno che ha nomi incorporati

Quando viene fatto un riferimento all'interno di una funzione, il nome viene cercato nello spazio dei nomi locale, quindi nello spazio dei nomi globale e infine nello spazio dei nomi integrato.

Se è presente una funzione all'interno di un'altra funzione, un nuovo ambito viene annidato all'interno dell'ambito locale.

Esempio di ambito e spazio dei nomi in Python

 def outer_function(): b = 20 def inner_func(): c = 30 a = 10

Here, the variable a is in the global namespace. Variable b is in the local namespace of outer_function() and c is in the nested local namespace of inner_function().

When we are in inner_function(), c is local to us, b is nonlocal and a is global. We can read as well as assign new values to c but can only read b and a from inner_function().

If we try to assign as a value to b, a new variable b is created in the local namespace which is different than the nonlocal b. The same thing happens when we assign a value to a.

However, if we declare a as global, all the reference and assignment go to the global a. Similarly, if we want to rebind the variable b, it must be declared as nonlocal. The following example will further clarify this.

 def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

As you can see, the output of this program is

 a = 30 a = 20 a = 10

In questo programma, tre diverse variabili a sono definite in spazi dei nomi separati e accessibili di conseguenza. Mentre nel seguente programma,

 def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)

L'output del programma è.

 a = 30 a = 30 a = 30 

Qui, tutti i riferimenti e le assegnazioni sono alla a globale a causa dell'uso della parola chiave global.

Articoli interessanti...