先看一个现象
类似这种让人confuse的现象有很多,如果单从概念上想说明白这事将非常困难,我们得从Python实现这种机制的源代码上来着手,要知道Python底层是通过C语言来实现的,而Python的C语言源代码不在安装包中,但可以从官网https://www.python.org/下载到
我们可以将下载的包解压到C盘查看里面的源代码文件
我们可以查看Include\intobject.h中对整型的实现代码
Python中对整数的实现都是通过PyIntObject来完成的,在Python2中整数对象PyIntObject是对C语言中long类型的包装,可以查看Objects\intobject.c中PyIntObject存储的元信息的代码
再查看Objects\intobject.c中定义小整数对象池的源码
小整数对象池的范围是-5到256,这是Python通过指针small_ints来减少小整数频繁分配内存的时间开销,所以就能解释图一中的现象,也就是说图一中如果实例化了一个整数在-5到256之间的数(包括-5和256)赋值的变量都将是同一个地址引用,下面的演示可以验证这个结果
具体为什么小整数对象池分配在这个区间笔者也不是很明白,但是你可以修改这个区间编译一个自己的Python版本使用,当然存在即有它的道理,不要轻易去修改前人铺好的路,作为学习理解是可以的。
那么对于大整数呢?试想如果将所有的整数对应的PyIntObject对象都缓存到内存池中,这是很理想的一种状态,但这样去使用内存合理吗?不合理,所以就要在鱼和熊掌之间取其一,大整数对象Python给出的策略是重新开辟内存空间,查看Objects\intobject.c中给大数据对象提供的轮流使用的策略
领取专属 10元无门槛券
私享最新 技术干货