Python整数内存管理解析:为何两示例is判断结果不同?
整数对象
is比较的差异解释 先看两个示例的运行结果:
示例1
a = 845 b = int("8"+"4"+"5") print(a == b) # True print(a is b) # False
示例2
a = 845 b = 840+5 print(a == b) # True print(a is b) # True
差异原因拆解
==和is的本质区别==仅判断两个对象的值是否相等,所以两个示例的这一结果都是True,逻辑完全合理。is是判断两个变量是否指向同一内存地址的对象,这才是差异产生的核心。
Python的编译优化与整数缓存规则
- Python为提升性能,会对**-5到256之间的小整数**做缓存,程序中用到该范围的整数时,都会复用同一个对象。但超出这个范围的整数,默认不会缓存——不过有个例外:如果是编译阶段就能确定的整数常量(比如示例2里的
840+5),解释器会直接计算出结果845,并让b和a指向同一个对象,所以is返回True。 - 示例1里的
int("8"+"4"+"5")是运行时动态生成的整数:字符串拼接和转整数的操作只有在程序运行时才会执行,这个过程会新创建一个值为845的整数对象,和之前a=845指向的对象不是同一个,所以is返回False。
- Python为提升性能,会对**-5到256之间的小整数**做缓存,程序中用到该范围的整数时,都会复用同一个对象。但超出这个范围的整数,默认不会缓存——不过有个例外:如果是编译阶段就能确定的整数常量(比如示例2里的
简单总结:编译期能确定的整数常量会复用对象,运行时动态生成的整数(哪怕值相同)会创建新对象,超出小整数缓存范围时就会出现这种地址不同的情况。
内容的提问来源于stack exchange,提问作者Rusheslav
相关产品推荐
相关产品推荐

