Bạn gần như chắc chắn đã đặt câu hỏi sai, và câu trả lời của Raymond Hettinger gần như chắc chắn là những gì bạn thực sự muốn.
Một cái gì đó như thế này có thể hữu ích khi cố gắng đào sâu vào phần bên trong của thông dịch viên CPython cho mục đích học tập hoặc kiểm toán nó cho các lỗ hổng bảo mật hoặc một cái gì đó, nhưng ngay cả khi đó, có lẽ bạn nên nhúng trình thông dịch Python vào một chương trình và viết các chức năng hiển thị Bất cứ điều gì bạn muốn vào trình thông dịch Python, hoặc ít nhất là viết mô -đun mở rộng C cho phép bạn thao tác các đối tượng CPython.
Nhưng, nếu bạn thực sự cần phải làm điều này
Đầu tiên, không có cách nào đáng tin cậy để thậm chí lấy địa chỉ từ repr
. Hầu hết các đối tượng có biểu diễn ____ 1 có khả năng sẽ cung cấp cho bạn điều đó thay thế. Ví dụ: repr của ['1', 1]
là "['1', 1]"
, không phải . Ngoài ra, ngay cả đối với các đối tượng không có biểu diễn hữu ích, việc trả lại
chỉ là một quy ước không có căn cứ mà nhiều loại tuân theo [và mặc định cho các lớp do người dùng xác định], không phải là thứ bạn có thể dựa vào.
Tuy nhiên, vì bạn có lẽ chỉ quan tâm đến CPython, bạn có thể dựa vào id
:
Chi tiết triển khai CPython: Đây là địa chỉ của đối tượng trong bộ nhớ.
. Có lẽ bạn vẫn có nó và chỉ không thể nhớ bạn đặt nó ở đâu]]
Tiếp theo, bạn làm gì với địa chỉ này? Chà, Python không phơi bày bất kỳ chức năng nào để làm ngược lại với id
. Nhưng API Python C được ghi lại rõ ràng và, nếu Python của bạn được xây dựng xung quanh một thư viện được chia sẻ, API C đó có thể được truy cập qua eval
0, chỉ bằng cách tải nó lên. Trên thực tế, eval
0 cung cấp một biến đặc biệt tự động tải thư viện được chia sẻ đúng để gọi API C, eval
2.
Trong các phiên bản rất cũ của eval
0, bạn có thể phải tìm và tải nó một cách rõ ràng, như eval
4 [đây là dành cho Linux với Python 2.5 được cài đặt vào /usr /lib; rõ ràng nếu bất kỳ chi tiết nào khác nhau, dòng lệnh chính xác sẽ khác nhau.]
Tất nhiên việc phá vỡ trình thông dịch Python làm điều này sẽ dễ dàng hơn nhiều so với việc làm bất cứ điều gì hữu ích, nhưng không thể làm bất cứ điều gì hữu ích, và bạn có thể vui vẻ thử nghiệm nó.
Cải thiện bài viết
Lưu bài viết
Trong Python, mọi thứ đều là một đối tượng, từ các biến đến danh sách và từ điển, mọi thứ đều được coi là đối tượng. & NBSP; Trong bài viết này, chúng ta sẽ lấy địa chỉ bộ nhớ của một đối tượng trong Python. & NBSP;
Phương pháp 1: Sử dụng ID []
Chúng ta có thể nhận được một địa chỉ bằng hàm id []. Hàm id [] cung cấp địa chỉ của đối tượng cụ thể.
Syntax:
id[object]
trong đó đối tượng là các biến dữ liệu.
Ví dụ: Chương trình Python để có được địa chỉ của các đối tượng khác nhauPython program to get the address of different objects
Python3
eval
5eval
6 eval
7eval
8eval
9['1', 1]
0eval
9['1', 1]
222
['1', 1]
8['1', 1]
9id
"['1', 1]"
1
eval
5eval
6 "['1', 1]"
4
['1', 1]
8['1', 1]
9____________"['1', 1]"
1
eval
5eval
6 ['1', 1]
9eval
8eval
9['1', 1]
0eval
9['1', 1]
222
['1', 1]
8['1', 1]
9id
"['1', 1]"
1
eval
5eval
6 8
9
id
0eval
8eval
9id
3id
0['1', 1]
0id
6
['1', 1]
8['1', 1]
9id
"['1', 1]"
1
Output:
140234866534752
94264748411744
140234904267376
140234866093264
Phương pháp 2: Sử dụng các mô -đun C_int, Địa chỉ
CTYPES là một thư viện chức năng nước ngoài cho Python. Nó cung cấp các loại dữ liệu tương thích C và cho phép gọi các chức năng trong DLL hoặc thư viện được chia sẻ.
Syntax:
addressof[c_int[object]]
trong đó đối tượng là các biến dữ liệu
Ví dụ: Chương trình Python để lấy địa chỉ bộ nhớ của & nbsp; một biến Python program to get the memory address of a variable
Python3
id
1 id
2id
3 id
4
eval
5eval
6 id
7
['1', 1]
8id
9
Output:
140234866278064
Cũng có thể nhận được địa chỉ bộ nhớ ở định dạng thập lục phân. Ở đây chúng tôi sẽ gọi hàm HEX [địa chỉ], để chuyển đổi địa chỉ bộ nhớ thành đại diện thập lục phân.
Syntax:
hex[id[object]]
where,
- hex [] là đại diện thập lục phân của bộ nhớ đến địa chỉ
- ID được sử dụng để có được bộ nhớ của đối tượng
- Đối tượng là dữ liệu
Ví dụ: Chương trình Python để có được địa chỉ bộ nhớ trong biểu diễn thập lục phân. Python program to get the memory address in hexadecimal representation.
Python3
eval
5eval
6 eval
7eval
8eval
9['1', 1]
0eval
9['1', 1]
222
['1', 1]
8['1', 1]
9id
5['1', 1]
9id
id
8
eval
5eval
6 "['1', 1]"
4
['1', 1]
8['1', 1]
9id
5['1', 1]
9id
id
8
eval
5eval
6 ['1', 1]
9eval
8eval
9['1', 1]
0eval
9['1', 1]
222
['1', 1]
8['1', 1]
9id
5['1', 1]
9id
id
8
eval
5eval
6 8
9
id
0eval
8eval
9id
3id
0['1', 1]
0id
6
['1', 1]
8['1', 1]
9id
5['1', 1]
9id
id
8
Output:
0x7fba9b0ae8c0
0x5572da858b60
0x7fba9f3c4a10
0x7fba9b05b8c0