English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Corso di base di Python

Controllo dei flussi di Python

Funzione in Python

Tipi di dati di Python

Operazioni di file di Python

Oggetti e classi di Python

Data e ora di Python

Conoscenze avanzate di Python

Manuale di riferimento di Python

Espacio de nombres y ámbito en Python

In questo articolo, imparerai il namespace, la mappatura tra nome e oggetto e l'ambito delle variabili.

Cos'è un namespace in Python?

Se hai mai letto 'Il Tao di Python' (inserisci import this nelinterpretedatore Python), l'ultima riga menziona cheUn namespace è un'ottima idea - facciamo di più!Allora cosa sono questi misteriosi namespace? Prima di tutto, vediamo cosa è un nome.

Il nome (noto anche come identificatore) è solo il nome assegnato all'oggetto. Tutto in Python èOggetto. Il nome è un modo per accedere all'oggetto di base.

Ad esempio, quando eseguiamo l'operazione di assegnazione a = 2, 2 è un oggetto memorizzato in memoria, easono i nomi associati. Possiamo usarle tramiteFunzioni built-in Ottieni l'indirizzo di alcuni oggetti (in RAM) con id(). Vediamo come usarlo.

# Attenzione: Potresti ottenere valori di id diversi
a = 2
print('id(2) =', id(2))
print('id(a) =', id(a))

Risultato di output

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

In questo caso, entrambi si riferiscono allo stesso oggetto 2, quindi hanno lo stesso id(). Facciamo qualcosa di interessante.

# Attenzione: Potresti ottenere valori di id diversi
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))

Risultato di output

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

Cosa è successo in questa sequenza di passaggi? Facciamo luce su questo con un diagramma:

Diagramma di memoria delle variabili in Python

All'inizio, viene creato un oggetto 2 e il nome a viene associato a esso. Quando si esegue a = a + 1, viene creato un nuovo oggetto 3 e ora a è associato a quell'oggetto.

Notare che id(a) e id(3) hanno lo stesso valore.

Inoltre, quando si esegue b = 2, il nuovo nome b è associato all'oggetto precedente 2.

Questo è valido perché Python non deve creare nuovi oggetti duplicati. La dinamica della binding dei nomi in Python lo rende potente. I nomi possono riferirsi a qualsiasi tipo di oggetto.

>>> a = 5
>>> a = 'Hello World!'
>>> a = [1,2,3]

Tutto questo è valido eaRiferirsi a tre diversi tipi di oggetti in diversi esempi.FunzioneSono anche oggetti, quindi i nomi possono riferirsi a loro.

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

Risultato di output

Hello

Nomi identiciaSi può riferire a una funzione e utilizzare il nome per chiamarla.

Cos'è uno spazio di nomi in Python?

Ora che abbiamo capito cosa sono i nomi, possiamo continuare con il concetto di spazio di nomi.

In breve, uno spazio di nomi è un insieme di nomi.

In Python, si può immaginare uno spazio di nomi come una mappatura di ogni nome a un oggetto corrispondente.

Diversi spazi di nomi possono coesistere in un dato momento, ma sono completamente isolati.

Quando avviamo l'interprete Python, viene creato uno spazio di nomi che contiene tutti i nomi integrati e questo spazio di nomi esiste fintanto che l'interprete è in esecuzione.

Ecco il motivo per cui le funzionalità integrate (ad esempio id()) e print() possono essere utilizzate sempre da ogni parte del programma. OgniModuloCreare il proprio spazio di nomi globale.

Questi diversi spazi di nomi sono isolati. Pertanto, i nomi identici che potrebbero esistere in diversi moduli non confliggeranno.

I moduli possono avere varie funzionalità e classi. Quando si chiama una funzione, viene creato uno spazio di nomi locale che definisce tutti i nomi. Simile a una classe. Il diagramma seguente potrebbe aiutare a chiarire questo concetto.

Diagramma dei diversi spazi di nomi in Python

Ambito delle variabili Python

Nonostante siano stati definiti vari spazi di nomi unici, potremmo non essere in grado di accedervi da ogni parte del programma. Il concetto di ambito inizia a funzionare.

Lo scope è una parte del programma, da cui è possibile accedere direttamente agli spazi dei nomi senza alcun prefisso.

Ci sono sempre almeno tre scope annidati in un dato momento.

  1. Lo scope della funzione corrente con nomi locali

  2. Lo scope del modulo con nomi globali

  3. Lo scope più esterno con nomi incorporati

Quando si fa riferimento a un nome all'interno di una funzione, si cerca prima nello scope locale, poi nello scope globale e infine nello scope incorporato.

Se c'è un'altra funzione all'interno di un'altra funzione, il nuovo scope è annidato all'interno dello scope locale.

Esempio di scope e spazi dei nomi di Python

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

Ecco, la variabileanello spazio dei nomi globale. La variabilebnello spazio dei nomi locale di outer_function() mentrecnello spazio dei nomi locale annidato di inner_function().

quando chiamiamo inner_function()cnella nostra localebnon localeain globale. Possiamo assegnare acleggere e assegnare un nuovo valore, ma solobeainner_function().

Se proviamo ad assegnare come valoreb, una nuova variabilebLa creazione di uno spazio dei nomi locale è diversa da quella non localeb. Quando assegniamo un valore, lo stesso accadeUn.

Ma se dichiariamoadichiarata come globale a, tutte le referenze e le assegnazioni saranno spostate al variabile globaleaSimilmente, se vogliamo ricollegare una variabilebSe dobbiamo dichiarare una variabile come non locale, è necessario dichiararla. Esempi successivi illustreranno questo punto.

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)

Come potete vedere, l'output del programma è

a = 30
a = 20
a = 10

In questo programma, sono stati definiti tre variabili diverse in diversi spazi dei nomiae sono stati effettuati gli accessi corrispondenti. 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, a causa dell'uso della parola chiave global, tutte le referenze e le assegnazioni si riferiscono al variabile globale a.