这篇博文是在我写关于Python中一切皆对象时所发现的问题,本来以为是个小问题,没曾想原来是一个值得深究的问题,因此特意单独写成一篇学习笔记总结一下。
在讨论Python 3中变量与对象关系的时候,总是会遇到一些莫名其妙的情况。
有时候值相等的两个整数对象在内存中地址是相同,有时候两者内存中地址又是不同的。
Google了一下发现,原来这是Python 3中存在一种 。
为了增加程序的运行效率,Python3的解释器中实现了小数字和字符串缓存的机制,小数字的缓冲范围是[-5 ~ 256],字符串的缓存位数默认是20位。在Python程序中每次初始化一个新的变量就会在内存中开辟一块空间来存储这个变量,当变量不用的时候再回收这块内存。当大量出现这种操作的时候CPU就会发热,工作效率下降。为了减轻CPU的这种负担,Python3的解释器便实现了小数字和字符串的缓存机制。
小数字缓存机制
小数字的缓冲范围是 ,意味着这个区间的所有整数都是存在缓冲区的,超出这个范围就不是了。
代码 很快就打脸了这一说法。说好的,超出缓冲范围的整数就不再是同一个对象了呢?
网上Google一遍,也没找到答案。不过,好在最后还是让我发现了问题关键所在
在命令行交互模式下,使用print()或不使用print(), 时,指向的是
同时这句话是没有错的,只不过需要换种方式验证。新的方式输出,即使同时输出两个对象,也会显示两个不同的内存地址
最后整数部分,负整数是特殊的。即使同时输出,对应的对象地址也是不同的
小数字缓冲机制,按理来说应该包含区间 中的, 部分与 部分的。
然而代码验证结果表明,小浮点数不具有缓冲机制。
字符串缓存机制
字符串的缓存位数默认是20位,意味着超过20为长度的字符串,即使字符串值相等,也不再是同一个对象。
超过20为长度的字符串,值相等,依旧指的是同一个对象?
其实,类似于上面小数字缓冲一样,需要换一种方式验证这句话。
其他一些连接字符串操作后长度超过20的规律与之类似,即使字符串值相等,但它们都不再是同一个对象了。
总结
对于小数字与字符串缓冲机制问题,一定要归纳出一个通用的规则,我觉得就是
对于超过了缓冲机制范围的小数字(整数)或字符串,只有是需要经过计算结果后的对象,才会创建一个新的对象;否则,初始对象(数字、字符串)都是有缓冲机制的。
这个规律说实话,不是很自然。只能说,也许在这些复杂的程序情况之下,有着更为深刻优雅的原因,可能涉及到Python 3底层源码的问题。只是无奈,能力有限,才疏学浅,目前没能找到更为优雅的解释。
领取专属 10元无门槛券
私享最新 技术干货