码迷,mamicode.com
首页 > 编程语言 > 详细

从内存上看python的对象

时间:2019-09-25 16:06:01      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:16进制   有一个   菜鸟   long   img   size   into   怎么   border   

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所在的内存地址

b0200000000000000e0316c93f87f000001000000000000001d090000

从结果来看,数字“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

从内存上看python的对象

标签:16进制   有一个   菜鸟   long   img   size   into   怎么   border   

原文地址:https://www.cnblogs.com/wujiecong/p/11579132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!