2015-02-07 11 views
6

Leggendo la "Introduzione alla scienza computer utilizzando Python" libro , da Carlo Dierbach, ho una domanda:Come sono correlati un nome e il suo valore di riferimento?

  • Nella pagina 210, dice "Un riferimento è un valore che fa riferimento, o“punti ", la posizione di un'altra entità. Il valore di riferimento di una variabile può essere determinato con l'ID della funzione incorporata."

Quindi un riferimentoè solo l'indirizzo in memoria di un oggetto.

Ora, se non sbaglio, quando creo una variabile del tipo:

>>> a = 3 

Il nome un è messo automaticamente da Python nella namespace.

Se lo faccio:

>>> id(a) 
4548344816 

ottengo l'indirizzo in memoria dell'oggetto , quella che un fa riferimento.

Quindi quello che voglio sapere è, come sono il nome un e il valore di riferimento correlati.

Sto indovinando che quando un nome è un put in uno spazio dei nomi, include 2 cose:

  1. Il nome stessa.

  2. Il valore di riferimento (id dell'oggetto)

Un accoppiamento come forse: a:reference value?

In tal caso, è disponibile uno strumento di analisi per visualizzare l'aspetto di una voce nello spazio dei nomi?

risposta

5

Gli spazi dei nomi Python sono, nel complesso, implementati come dizionari. Una chiave associa ad un valore, e in un namespace le chiavi sono gli identificatori, i nomi e i valori fanno riferimento agli oggetti a cui sono legati i nomi.

È già stato trovato lo strumento che rende visibile la parte "di riferimento", la funzione id(). È possibile utilizzare i globals() e locals() funzioni per accedere alle mappature di namespace:

>>> a = 3 
>>> globals().keys() 
['__builtins__', '__name__', '__doc__', 'a', '__package__'] 
>>> globals()['a'] 
3 
>>> id(globals()['a']) 
4299183224 
>>> id(a) 
4299183224 

Nota, tuttavia, che in una funzione, lo spazio dei nomi locale è stato altamente ottimizzato e il dizionario restituito da locals() è solo un riflesso a senso unico del struttura reale, che è solo un array C con riferimenti. Puoi guardare, ma non toccare, attraverso questa mappatura.

Se si desidera visualizzare ulteriormente come funzionano gli spazi dei nomi Python, eseguire il codice in Online Python Tutor; ti mostrerà come interagiscono i nomi e gli oggetti Python in memoria.

+1

Aha, sto seguendo un altro libro di Mark Lutz, "Learning Python", e in pag. 176 dice * "le variabili e gli oggetti sono memorizzati in diverse parti della memoria e sono associati ai collegamenti" *. So che posso ottenere l'indirizzo dell'oggetto con 'id()', ma c'è un modo per scoprire l'indirizzo del ** nome ** stesso? – javi

+1

Inoltre, nella prossima pagina dice * "Le variabili sono voci in una tabella di sistema, con spazi per i collegamenti agli oggetti." * Queste voci a cui si riferisce sono gli elementi del dizionario del namespace. Ogni ** elemento ** in quel dizionario funziona come un ** link **, che lega il nome e l'oggetto. Destra? – javi

+0

@javi: il libro è impreciso. Gli oggetti frame mantengono gli spazi dei nomi, ma sia gli oggetti frame * che * gli oggetti nome (che sono solo oggetti stringa) vivono tutti nello stesso spazio di memoria. –

Problemi correlati