CPython小整数缓存:多值赋值时为何表现不同?
CPython整数赋值的
is判断差异解析 核心原因:编译单元与常量折叠优化
这本质上是CPython编译阶段的常量优化策略差异导致的,和两种赋值方式的编译单元范围直接相关:
单独两行赋值(
x=500、y=500):
在交互模式下,每一行代码都会被当作独立的编译单元,编译成单独的代码对象。每次编译时,都会为500创建一个全新的整数对象,因此x和y指向不同的内存地址,x is y返回False。单行元组解包赋值(
x,y=500,500):
整行代码属于同一个编译单元,CPython编译器会触发常量折叠优化——识别到同一代码块内出现了两次相同的常量500,只会生成一个整数对象实例。最终x和y都指向这个唯一的对象,所以x is y返回True。
额外说明
- 这种优化并非小整数缓存的延伸,而是编译器针对同一代码块内常量的复用策略。如果在同一个脚本文件(而非交互模式的单行输入)里,哪怕分两行写
x=500和y=500,只要它们处于同一代码块(比如全局作用域、同一个函数内),编译时也会触发常量折叠,x is y同样会返回True。 is判断的是对象的身份(内存地址),而==判断的是值。对于整数场景,除非明确需要校验对象身份,否则优先用==比较值更稳妥。
内容的提问来源于stack exchange,提问作者Floella
相关产品推荐
相关产品推荐

