Python 3.10 IDLE中非驻留整数身份比较返回True问题
该现象的核心原因是CPython的编译期常量折叠优化,和小整数驻留机制无关
你认知中的
[-5, 256]整数驻留是CPython的运行时全局缓存机制,该机制确实只会缓存这个区间的整数对象、全局复用,和你遇到的情况属于完全不同的两个优化逻辑。
- 当你把代码存入
.py文件批量运行时,整个脚本的顶层代码属于同一个编译单元,CPython编译器在生成字节码前会做常量折叠优化:同一个代码块内出现的相同值的不可变字面量(包括整数、字符串、常量元组等)会被合并为同一个对象,减少重复的内存占用。 - 你代码里的
258656565是同一个代码块里两次出现的整数字面量,编译时就被合并为同一个对象,所以x1和y1指向同一个内存地址,is判断返回True,这个过程和小整数驻留没有关系。 - 如果在IDLE的交互Shell里逐行输入代码执行,每一行输入都是独立的编译单元,编译器不会跨代码块做常量折叠,此时两次赋值的
258656565会生成两个不同的对象,is判断就会返回你预期的False,可以自行测试验证。
最佳实践
永远不要依赖is判断两个不可变类型的值是否相等,is的设计用途是判断对象身份(比如判断变量是否为None、是否为自定义单例对象),值相等判断请固定使用==。因为常量折叠、驻留这类优化都属于CPython的实现细节,不同Python解释器、不同版本的实现逻辑都可能发生变化,依赖这类细节写的代码兼容性极差。
内容的提问来源于stack exchange,提问作者meallhour
相关产品推荐
相关产品推荐

