Подтвердить что ты не робот

Адрес памяти для печати переменной Python

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

4b9b3361

Ответ 1

id - это метод, который вы хотите использовать: чтобы преобразовать его в hex:

hex(id(variable_here))

Например:

x = 4
print hex(id(x))

Дал мне:

0x9cf10c

Что вы хотите, правильно?

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

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

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

Ответ 2

Невозможно получить адрес памяти значения в 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 или аналогичный.

Ответ 3

В соответствии с руководство, в CPython id() находится фактический адрес памяти переменной. Если вы хотите его в шестнадцатеричном формате, назовите hex() на нем.

x = 5
print hex(id(x))

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