Python 3.11.1整数驻留范围疑问:超出-5至256为何仍生效?
Python 3.11.1中整数驻留的疑问
我之前通过搜索得知Python 3的整数驻留范围是-5至256,但测试该范围外的数值时,发现整数驻留似乎仍在生效。例如:
x = 258 y = 258 print("Address of x: ", id(x)) print("Address of y: ", id(y)) print(x is y)
运行结果为:
Address of x: 2380522692112 Address of y: 2380522692112 True
将x和y改为20000时,我得到了类似的结果。我原本预期x和y的内存地址不同,第三行输出为False,这和一篇旧帖子中的结果一致。
请问整数驻留的限制范围是否已变更?若已变更,新的范围是什么?我使用的是Python 3.11.1版本。
提前致谢!
解答
这并不是小整数池的范围发生了变更,而是Python编译器的常量折叠优化在起作用:
- Python确实会预创建-5到256的整数对象(小整数池),这些对象在整个程序运行期间都会被复用,不受代码块限制。
- 对于超出这个范围的整数,若在同一个代码块中出现相同的字面量,编译器会在编译阶段将它们合并为同一个对象,所以你会看到x和y的内存地址相同。
- 但如果把赋值操作放在不同的代码块(比如不同函数、交互式环境中逐行输入),就不会触发这个优化,此时超出-5到256的整数会被创建为不同对象,
x is y会返回False。
举个例子,在交互式环境中逐行输入:
x = 258 y = 258 x is y # 这里会返回False
而如果把代码放在同一个脚本文件中执行,就会返回True,这就是常量折叠的差异。
内容的提问来源于stack exchange,提问作者VigoHolo
相关产品推荐
相关产品推荐

