python從記憶體地址上載入python物件過程詳解
阿新 • • 發佈:2020-01-09
這篇文章主要介紹了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語句都無法捕捉到這種異常。就當是瞭解一下吧
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。