2013-05-06 21 views
40

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

+6

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

Odpowiedz

73

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.

+5

Myślę, że to jest specyficzne dla CPython. Jest też 'addressof' od [ctype] (http://docs.python.org/2/library/ctypes.html#ctypes.addressof). – nvlass

+1

To dotyczy tylko małych' int's, jak sądzę. – Daenyth

+1

Dowiedzmy się @Denyth! – BlackVegetable

4

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.

8

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.

+0

To jest najdokładniejsza odpowiedź! Zarówno do tego posta, jak i do "duplikatu" (http://stackoverflow.com/questions/121396/accessing-object-memory-address) – DilithiumMatrix