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
- 1. Python środowisko drukowania zmienna adres pamięci
- 2. Jak mogę wydrukować adres pamięci zmiennej?
- 3. Jak mogę uzyskać adres pamięci zmiennej JavaScript?
- 4. drukuj nazwę zmiennej w #define
- 5. Drukuj znak Unicode ze zmiennej (swift)
- 6. adres C adresu zmiennej
- 7. Drukuj zamieszanie
- 8. Właściwy sposób na zwolnienie pamięci zwróconej zmiennej
- 9. ustawienie zmiennej w pamięci lokalnej
- 10. Zakres zmiennej globalnej Python
- 11. grep - drukuj wiersz wcześniej, nie drukuj mecz
- 12. Python - Jak uzyskać adres początkowy/bazowy procesu?
- 13. Wykorzystanie pamięci Spark/przędzy Python
- 14. Jak wydrukować/zarejestrować adres zmiennej w NDK
- 15. gdb znajdź adres pamięci o numerze linii
- 16. Jak wydrukować adres pamięci listy w Haskell
- 17. Jak zdobyć adres pamięci stosu Java?
- 18. Czy funkcje C mają stały adres pamięci?
- 19. Montaż: Adres pamięci zmiennych w C Programowanie
- 20. Uzyskaj adres pamięci wskazywany przez wskaźnik ctypes
- 21. adres pamięci wartość dodatnia lub ujemna w c?
- 22. Drukuj bieżący stos wywołań z metody w kodzie Python
- 23. Drukuj i pexpect logowanie
- 24. Python PrettyPrint wyjście do zmiennej
- 25. Python mock instancja klasy zmiennej
- 26. Jak wydrukować zawartość pamięci zmiennej w C?
- 27. Śledzenie zmiennej lub zmiana pamięci w Xcode?
- 28. Przenoszenie dużej zmiennej ilości pamięci z Cuda
- 29. Python list anomalne użycie pamięci
- 30. Debugowanie wycieku pamięci Python/NumPy
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