1. 程式人生 > 程式設計 >python從記憶體地址上載入python物件過程詳解

python從記憶體地址上載入python物件過程詳解

這篇文章主要介紹了python從記憶體地址上載入pythn物件過程詳解,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

在python中我們可以通過id函式來獲取某個python物件的記憶體地址,或者可以通過呼叫物件的__repr__魔術函式來獲取物件的詳細資訊

def tt():
  print(111)
print(tt.__repr__())
print(id(tt))

但是不知大家是否想過,其實這個記憶體地址可以直接載入python物件的。有兩種方法:

1. PyObj_FromPtr

在_ctypes包中,就提供PyObj_FromPtr這個api去實現我們的需求。程式碼如下

def tt():
  print(111)
print(tt.__repr__())
print(_ctypes.PyObj_FromPtr(id(tt)))

執行結果如下:

<function tt at 0x106c628c8>
<function tt at 0x106c628c8>

2. gc.get_objects

我們也可以通過gc的get_objects方法來實現。先來看一下官方介紹

gc.get_objects()
Returns a list of all objects tracked by the collector,excluding the list returned.

大致意思為,獲取所有可以追蹤的物件。所以,我們可以通過第二種方式來實現從特定記憶體地址載入python物件

def tt():
  print(111)
print(tt.__repr__())

for i in gc.get_objects():
  if id(i) == id(tt):
    print(i)

方法很簡單,通過gc.get_objects獲取所有物件,一一檢查這些物件的記憶體地址是否與給定的記憶體地址相符,如果相符則返回物件。

結論

額,很扯淡的東西,最好不要亂用這種東西。因為出錯的話,try except語句都無法捕捉到這種異常。就當是瞭解一下吧

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。