Hướng dẫn python get object from memory address - python lấy đối tượng từ địa chỉ bộ nhớ

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)"('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 eval0, chỉ bằng cách tải nó lên. Trên thực tế, eval0 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, eval2.

Trong các phiên bản rất cũ của eval0, bạn có thể phải tìm và tải nó một cách rõ ràng, như eval4 (đâ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

eval5eval6 eval7eval8eval9('1', 1)0eval9('1', 1)222

('1', 1)8('1', 1)9id"('1', 1)"1

eval5eval6 "('1', 1)"4

('1', 1)8('1', 1)9____________"('1', 1)"1

eval5eval6 ('1', 1)9eval8eval9('1', 1)0eval9('1', 1)222

('1', 1)8('1', 1)9id"('1', 1)"1

eval5eval6 89id0eval8eval9id3id0('1', 1)0id6

('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

id1 id2id3 id4

eval5eval6 id7

('1', 1)8id9

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

eval5eval6 eval7eval8eval9('1', 1)0eval9('1', 1)222

('1', 1)8('1', 1)9id5('1', 1)9idid8

eval5eval6 "('1', 1)"4

('1', 1)8('1', 1)9id5('1', 1)9idid8

eval5eval6 ('1', 1)9eval8eval9('1', 1)0eval9('1', 1)222

('1', 1)8('1', 1)9id5('1', 1)9idid8

eval5eval6 89id0eval8eval9id3id0('1', 1)0id6

('1', 1)8('1', 1)9id5('1', 1)9idid8

Output:

0x7fba9b0ae8c0

0x5572da858b60

0x7fba9f3c4a10

0x7fba9b05b8c0


Tôi có thể lấy một đối tượng Python từ địa chỉ bộ nhớ của nó không?

Bây giờ chúng tôi có địa chỉ, chúng tôi có thể nhận lại các đối tượng giá trị/python từ địa chỉ bộ nhớ bằng mô -đun CTYPES. trong đó, memeory_address là địa chỉ bộ nhớ của biến. Giá trị là phương pháp được sử dụng để trích xuất một giá trị.using ctypes module. where, memeory_address is the memory address of the variable. value is the method which is used to extract a value.

Là địa chỉ của vị trí bộ nhớ nơi được lưu trữ đối tượng?

Là địa chỉ của vị trí bộ nhớ nơi được lưu trữ đối tượng?Một con trỏ tham chiếu một vị trí trong bộ nhớ và có được giá trị được lưu trữ tại vị trí đó được gọi là phân tích con trỏ.A pointer references a location in memory, and obtaining the value stored at that location is known as dereferencing the pointer.

__ repr __ trong Python là gì?

Chức năng Python __repr __ () trả về biểu diễn đối tượng trong định dạng chuỗi.Phương thức này được gọi khi hàm repr () được gọi trên đối tượng.Nếu có thể, chuỗi được trả về phải là biểu thức Python hợp lệ có thể được sử dụng để tái tạo lại đối tượng.returns the object representation in string format. This method is called when repr() function is invoked on the object. If possible, the string returned should be a valid Python expression that can be used to reconstruct the object again.

__ str __ trong Python là gì?

Phương thức __str__ trong Python đại diện cho các đối tượng lớp dưới dạng chuỗi - nó có thể được sử dụng cho các lớp.Phương pháp __str__ nên được xác định theo cách dễ đọc và xuất ra tất cả các thành viên của lớp.Phương pháp này cũng được sử dụng như một công cụ gỡ lỗi khi các thành viên của một lớp cần được kiểm tra.