Làm cách nào để in địa chỉ bộ nhớ của biến trong Python 2.7? Tôi biết id() trả về 'id' của một biến hoặc đối tượng, nhưng điều này không trả về kiểu mong muốn 0x3357e182 mà tôi mong đợi để xem địa chỉ bộ nhớ. Tôi muốn làm một cái gì đó như print &x
, trong đó x là một biến C++ int chẳng hạn. Tôi có thể làm điều này bằng Python bằng cách nào?địa chỉ bộ nhớ in của biến số Python
Trả lời
id
là phương pháp mà bạn muốn sử dụng: để chuyển nó sang hex:
hex(id(variable_here))
Ví dụ:
x = 4
print hex(id(x))
Gave tôi:
0x9cf10c
Đó là những gì bạn muốn, phải không?
(Thực tế thú vị, ràng buộc hai biến với cùng int
có thể dẫn đến các địa chỉ bộ nhớ tương tự được sử dụng.)
Hãy thử:
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))
này đã cho tôi cặp giống hệt nhau, ngay cả đối với các số nguyên lớn.
Tôi nghĩ rằng đây là CPython cụ thể. Ngoài ra còn có 'addressof' từ [ctype] (http://docs.python.org/2/library/ctypes.html#ctypes.addressof) – nvlass
Điều này chỉ áp dụng cho' int 'nhỏ, tôi tin. – Daenyth
Hãy cùng tìm hiểu @Daenyth! – BlackVegetable
Theo the manual, trong CPython id()
là địa chỉ bộ nhớ thực của biến. Nếu bạn muốn ở định dạng hex, hãy gọi số hex()
trên đó.
x = 5
print hex(id(x))
điều này sẽ in địa chỉ bộ nhớ của x.
Không có cách nào để lấy địa chỉ bộ nhớ của một giá trị trong Python 2.7 nói chung. Trong Jython hoặc PyPy, việc triển khai thậm chí không biết địa chỉ của giá trị của bạn (và thậm chí không đảm bảo rằng nó sẽ ở cùng một nơi — ví dụ, bộ thu gom rác được phép di chuyển xung quanh nếu nó muốn).
Tuy nhiên, nếu bạn chỉ quan tâm đến CPython, id
đã trả lại địa chỉ. Nếu vấn đề chỉ là làm thế nào để định dạng mà số nguyên trong một cách nào đó ... nó giống như định dạng bất kỳ số nguyên:
>>> hex(33)
0x21
>>> '{:#010x}'.format(33) # 32-bit
0x00000021
>>> '{:#018x}'.format(33) # 64-bit
0x0000000000000021
... và vân vân.
Tuy nhiên, gần như không bao giờ có lý do chính đáng cho việc này. Nếu bạn thực sự cần địa chỉ của một đối tượng, có lẽ là để chuyển nó đến ctypes
hoặc tương tự, trong trường hợp này bạn nên sử dụng ctypes.addressof
hoặc tương tự.
Đây là câu trả lời chính xác nhất! Cả hai bài đăng này và "trùng lặp" (http://stackoverflow.com/questions/121396/accessing-object-memory-address) – DilithiumMatrix
Lưu ý rằng 'id' không phải là một con trỏ ở tất cả trong PyPy hoặc Jython (không chắc chắn về IronPython); đây là một điều cụ thể của CPython. Quan trọng hơn ... tại sao bạn lại muốn địa chỉ? Bất kỳ trường hợp sử dụng thực tế nào cũng có thể liên quan đến 'ctypes', trong trường hợp này bạn muốn sử dụng 'ctypes' để lấy địa chỉ ở định dạng mà bạn có thể chuyển tới mã C, không phải' id'. – abarnert