从内存上看python的对象

Posted wujiecong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从内存上看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所在的内存地址

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的对象的主要内容,如果未能解决你的问题,请参考以下文章

python对象和json对象有啥区别?

netcdf4-python:随着从 netcdf 对象多次调用切片数据,内存增加

在 Python 中直接从内存中保存多个对象以压缩

我可以从它的内存地址中获取一个 python 对象吗?

如何在 Python 3 中从字节缓冲区构造内存中的 TarFile 对象?

python的内存管理机制