Jak wydrukować adres pamięci zmiennej w Pythonie 2.7? Wiem, że id() zwraca "identyfikator" zmiennej lub obiektu, ale nie zwraca oczekiwanego stylu 0x3357e182, który oczekiwałam dla adresu pamięci. Chcę zrobić coś takiego, jak print &x
, gdzie x to na przykład zmienna int C++. Jak mogę to zrobić w Pythonie?drukuj adres pamięci zmiennej Python
Odpowiedz
id
jest metoda chcesz używać: aby przekształcić go hex:
hex(id(variable_here))
Na przykład:
x = 4
print hex(id(x))
dał mi:
0x9cf10c
Który czego chcesz, prawda?
(Fun Fakt, wiążąc dwie zmienne do tej samej int
może spowodować ten sam adres pamięci używany.)
Spróbuj:
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))
To dało mi identyczne pary, nawet dla dużych liczb całkowitych.
Myślę, że to jest specyficzne dla CPython. Jest też 'addressof' od [ctype] (http://docs.python.org/2/library/ctypes.html#ctypes.addressof). – nvlass
To dotyczy tylko małych' int's, jak sądzę. – Daenyth
Dowiedzmy się @Denyth! – BlackVegetable
Zgodnie z the manual, w CPython id()
jest aktualny adres pamięci zmiennej. Jeśli chcesz go w formacie szesnastkowym, zadzwoń pod numer hex()
.
x = 5
print hex(id(x))
spowoduje wydrukowanie adresu pamięci x.
Nie ma sposobu na uzyskanie adresu pamięci wartości w ogóle w Pythonie 2.7. W Jython lub PyPy implementacja nawet nie zna twojego adresu wartości (i nie ma nawet gwarancji, że pozostanie w tym samym miejscu - na przykład, garbage collector może go przenieść, jeśli chce).
Jeśli jednak interesuje Cię tylko CPython, to id
już zwraca adres. Jeśli jedynym problemem jest to, jak format, który całkowitą w pewien sposób ... to jest taka sama, jak formatowanie dowolny całkowitą:
>>> hex(33)
0x21
>>> '{:#010x}'.format(33) # 32-bit
0x00000021
>>> '{:#018x}'.format(33) # 64-bit
0x0000000000000021
... i tak dalej.
Jednak prawie nigdy nie ma ku temu dobrego powodu. Jeśli rzeczywiście potrzebujesz adresu obiektu, prawdopodobnie przekazujesz go do ctypes
lub podobnego, w takim przypadku powinieneś użyć ctypes.addressof
lub podobnego.
To jest najdokładniejsza odpowiedź! Zarówno do tego posta, jak i do "duplikatu" (http://stackoverflow.com/questions/121396/accessing-object-memory-address) – DilithiumMatrix
Zauważ, że 'id' nie jest wskaźnikiem w ogóle w PyPy lub Jython (nie masz pewności co do IronPython); to jest specyficzna dla CPythona. Co ważniejsze ... dlaczego chcesz adres? Każdy realistyczny przypadek użycia będzie prawdopodobnie obejmował 'ctypes', w którym to przypadku chcesz użyć' ctypes', aby uzyskać adres w formacie, który możesz przekazać do kodu C, a nie 'id'. – abarnert