2013-05-06 6 views
40

Как распечатать адрес памяти переменной в Python 2.7? Я знаю, что id() возвращает 'id' переменной или объекта, но это не возвращает ожидаемый стиль 0x3357e182, который я ожидал увидеть для адреса памяти. Я хочу сделать что-то вроде print &x, где x - это переменная типа C++, например. Как это сделать в Python?адрес памяти памяти переменной Python

+6

Обратите внимание, что 'id' не является указателем вообще в PyPy или Jython (не уверен в IronPython); это специфичная для CPython вещь. Что еще важнее ... зачем вам адрес? Любой реалистичный вариант использования, вероятно, будет включать 'ctypes', и в этом случае вы хотите использовать' ctypes', чтобы получить адрес в формате, который вы можете передать на C-код, а не 'id'. – abarnert

ответ

73

id является метод, который вы хотите использовать: чтобы преобразовать его в шестнадцатеричном:

hex(id(variable_here))

Например:

x = 4 
print hex(id(x)) 

Гав мне:

0x9cf10c 

Что что вы хотите, не так ли?

(Забавный факт, связывающий две переменные с тем же int может привести используется тот же адрес памяти.)
Try:

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)) 

Это дало мне одинаковые пары, даже для больших целых чисел.

+5

Я думаю, что это специфичный для CPython. Существует также 'addressof' из [ctype] (http://docs.python.org/2/library/ctypes.html#ctypes.addressof) – nvlass

+1

Это относится только к маленьким' int', я считаю. – Daenyth

+1

Давайте узнаем @ Даенит! – BlackVegetable

4

Согласно the manual, в CPython id() - это фактический адрес памяти переменной. Если вы хотите его в шестнадцатеричном формате, наберите hex().

x = 5 
print hex(id(x)) 

это напечатает адрес памяти x.

8

Невозможно получить адрес памяти значения в Python 2.7 в целом. В Jython или PyPy реализация даже не знает адрес вашего значения (и даже нет гарантии, что он останется в одном месте - например, сборщику мусора разрешено перемещать его, если он захочет).

Однако, если вы только заботитесь о CPython, id уже возвращает адрес. Если единственная проблема в том, как отформатировать это целое число в некотором роде ... это то же самое, как форматирование любого целого:

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

... и так далее.

Однако для этого почти нет веской причины. Если вам действительно нужен адрес объекта, он, вероятно, должен передать его ctypes или тому подобное, и в этом случае вы должны использовать ctypes.addressof или аналогичный.

+0

Это самый точный ответ! И на этот пост, и на «дубликат» (http://stackoverflow.com/questions/121396/accessing-object-memory-address) – DilithiumMatrix