2013-05-06 25 views
40

Come si stampa l'indirizzo di memoria di una variabile in Python 2.7? So id() restituisce l''id' di una variabile o oggetto, ma questo non restituisce lo stile 0x3357e182 che mi aspettavo di vedere per un indirizzo di memoria. Voglio fare qualcosa come print &x, dove x è una variabile int C++ per esempio. Come posso farlo in Python?indirizzo di memoria di stampa della variabile Python

+6

Si noti che 'id' non è affatto un puntatore in PyPy o Jython (non si sa su IronPython); questa è una cosa specifica per CPython. Ancora più importante ... perché vuoi l'indirizzo? Ogni caso d'uso realistico probabilmente coinvolgerà 'ctype', nel qual caso si desidera utilizzare' ctypes' per ottenere l'indirizzo in un formato che si può passare al codice C, non 'id'. – abarnert

risposta

73

id è il metodo che si desidera utilizzare: per convertirlo in esadecimale:

hex(id(variable_here))

Per esempio:

x = 4 
print hex(id(x)) 

Mi ha dato:

0x9cf10c 

Quale è quello che vuoi, vero?

(Una curiosità, vincolante due variabili allo stesso int può comportare lo stesso indirizzo di memoria in uso.)
Prova:

x = 4 
y = 4 
w = 9999 
v = 9999 
a = 12345678 
b = 12345678 
print hex(id(x)) 
print hex(id(y)) 
print hex(id(w)) 
print hex(id(v)) 
print hex(id(a)) 
print hex(id(b)) 

questo mi ha dato coppie identiche, anche per le grandi numeri interi.

+5

Penso che questo sia specifico per CPython. C'è anche 'addressof' da [ctype] (http://docs.python.org/2/library/ctypes.html#ctypes.addressof) – nvlass

+1

Questo vale solo per i' int's piccoli, credo. – Daenyth

+1

Scopriamolo @Daenyth! – BlackVegetable

4

In base a the manual, in CPython id() è l'indirizzo di memoria effettivo della variabile. Se lo vuoi in formato esadecimale, chiama lo hex() su di esso.

x = 5 
print hex(id(x)) 

questo stamperà l'indirizzo di memoria di x.

8

Non c'è modo di ottenere l'indirizzo di memoria di un valore in Python 2.7 in generale. In Jython o PyPy, l'implementazione non conosce nemmeno l'indirizzo del tuo valore (e non c'è nemmeno la garanzia che rimanga nello stesso luogo, ad es. Il garbage collector può spostarlo se lo desidera).

Tuttavia, se si interessa solo di CPython, sta già restituendo l'indirizzo. Se l'unico problema è come formattare che integer in un certo modo ... è la stessa di formattazione qualsiasi intero:

>>> hex(33) 
0x21 
>>> '{:#010x}'.format(33) # 32-bit 
0x00000021 
>>> '{:#018x}'.format(33) # 64-bit 
0x0000000000000021 

... e così via.

Tuttavia, non c'è quasi mai una buona ragione per questo. Se è effettivamente necessario l'indirizzo di un oggetto, è presumibile passarlo a ctypes o simile, nel qual caso è necessario utilizzare ctypes.addressof o simile.

+0

Questa è la risposta più accurata! Sia per questo post che per il "duplicato" (http://stackoverflow.com/questions/121396/accessing-object-memory-address) – DilithiumMatrix

Problemi correlati