Как распечатать адрес памяти переменной в Python 2.7? Я знаю, что id() возвращает 'id' переменной или объекта, но это не возвращает ожидаемый стиль 0x3357e182, который я ожидал увидеть для адреса памяти. Я хочу сделать что-то вроде print &x
, где x - это переменная типа C++, например. Как это сделать в Python?адрес памяти памяти переменной Python
ответ
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))
Это дало мне одинаковые пары, даже для больших целых чисел.
Я думаю, что это специфичный для CPython. Существует также 'addressof' из [ctype] (http://docs.python.org/2/library/ctypes.html#ctypes.addressof) – nvlass
Это относится только к маленьким' int', я считаю. – Daenyth
Давайте узнаем @ Даенит! – BlackVegetable
Согласно the manual, в CPython id()
- это фактический адрес памяти переменной. Если вы хотите его в шестнадцатеричном формате, наберите hex()
.
x = 5
print hex(id(x))
это напечатает адрес памяти x.
Невозможно получить адрес памяти значения в 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
или аналогичный.
Это самый точный ответ! И на этот пост, и на «дубликат» (http://stackoverflow.com/questions/121396/accessing-object-memory-address) – DilithiumMatrix
Обратите внимание, что 'id' не является указателем вообще в PyPy или Jython (не уверен в IronPython); это специфичная для CPython вещь. Что еще важнее ... зачем вам адрес? Любой реалистичный вариант использования, вероятно, будет включать 'ctypes', и в этом случае вы хотите использовать' ctypes', чтобы получить адрес в формате, который вы можете передать на C-код, а не 'id'. – abarnert