从内存上看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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值