從內存上看python的對象

python中有一個說法:一切皆是對象,怎麼理解這句話呢?我們可以通過查看數字,字符串在內存中的表示形式來對這句話有個更深的認識。

那麼,怎麼查看對象在內存中是什麼樣的呢?可以先參考一些這篇文章:https://www.cnblogs.com/wujiecong/p/11583540.html

1.python的數字在內存中是什麼樣的?

#python3.7
from ctypes import string_at
from sys import getsizeof
from binascii import hexlify

a = 2333
print(hexlify(string_at(id(a),getsizeof(a))))

運行結果則是數字2333在內存中的數據的十六進制表示(變量a實際上是指向2333所在的內存地址

b'0200000000000000e0316c93f87f000001000000000000001d090000'

從結果來看,數字“2333”在內存中存儲着不少的信息。我們可以按照PyObject結構將其拆解開來。

0200 0000 0000 0000
e031 6c93 f87f 0000
0100 0000 00000000
1d090000
 引用計數  類型    值

對以上數據進行校驗:

1.2333的的16進製表示是91D,看來採用的是小端模式。
2.通過sys.getrefcount()查看引用計數

 3.int的子類是它本身

 

 

2.python會動態地給數字對象分配內存,那界限是什麼呢?

經過試驗,不同的環境機器有不同的界限,本機是0x3FFFFFFF

菜鳥的在線工具是0x7FFFFFFFFFFFFFFF

 

 3.int對象的結構

查看源碼裏int對象的結構,與我們在內存上看到的一致。

typedef struct {
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;        
    long ob_ival;
} PyIntObject

原文出處:https://www.cnblogs.com/wujiecong/p/11579132.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章