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