0

0

Python 小整数缓存机制面试常见问题

舞姬之光

舞姬之光

发布时间:2026-02-25 20:05:46

|

373人浏览过

|

来源于php中文网

原创

小整数缓存范围是-5到256(含),这是cpython实现的性能优化,基于高频使用经验设定,并非语言规范要求;超出该范围的整数每次创建均为新对象,故应始终用==而非is比较数值相等。

python 小整数缓存机制面试常见问题

Python 中的小整数缓存(small integer caching)是面试中高频出现的概念,核心在于理解 is== 的区别、对象身份与值相等的差异,以及 CPython 实现层面的优化策略。

小整数缓存的范围是多少?为什么是这个范围?

CPython 默认缓存 -5 到 256(含两端)之间的所有整数。这个范围不是语言规范强制要求的,而是 CPython 解释器的实现细节(见 Objects/longobject.c 中的 NSMALLPOSINTSNSMALLNEGINTS 宏定义)。

选择该范围主要基于经验统计:日常代码中,这个区间内的整数被频繁使用(如循环索引、布尔结果、列表长度、ASCII 码等),缓存它们能显著减少内存分配和垃圾回收开销。

  • 超出该范围的整数每次创建都是新对象(即使值相同)
  • 不同 Python 实现(如 PyPy、Jython)可能不缓存,或缓存策略不同
  • 该行为不可依赖于跨版本或跨实现的稳定性

为什么 a = 256; b = 256; a is b 返回 True,但 a = 257; b = 257; a is b 却不一定?

因为 256 在缓存范围内,解释器在编译期或运行期复用同一个对象;而 257 不在缓存范围内,通常每次字面量出现都会新建一个 int 对象。

立即学习Python免费学习笔记(深入)”;

但注意:在交互式环境或同一代码块中,编译器可能做常量折叠(constant folding)优化,导致看似“意外”的 is 为 True:

Bardeen AI
Bardeen AI

使用AI自动执行人工任务

下载
# 同一行或同一代码块中,可能被优化为同一对象
a, b = 257, 257  # 可能 a is b → True(因常量合并)
c = 257; d = 257  # 也可能 True(取决于编译器处理方式)
<h1>但分开执行就大概率是 False</h1><p>e = 257
f = 257
print(e is f)  # 很可能 False

因此,永远不要用 is 比较整数是否相等——应使用 ==

如何验证某个整数是否被缓存?

最直接的方法是检查两个相同值的整数对象是否为同一对象:

def is_cached(n):
    a = n
    b = n
    return a is b
<p>print(is_cached(256))   # True
print(is_cached(257))   # 通常 False(但非绝对,见上条说明)

更严谨的方式是观察对象 ID 是否一致,或借助 sys.getrefcount()(注意:调用本身会临时增加引用计数):

  • 缓存整数的引用计数通常远高于普通整数(因全局持有)
  • getrefcount() 不适合用于判断缓存,仅作辅助观察

面试中容易踩坑的延伸问题

考官常借小整数缓存引申出更深层的理解:

  • 为什么 True is 1False is 0 是 False? 因为 boolint 的子类,但 TrueFalse 是单例对象,各自独立于整数缓存池。它们的 ID 与 10 不同。
  • 字符串也有类似缓存吗? 有,叫“字符串驻留(string interning)”,但规则不同:仅对符合标识符规则的字符串(如变量名)自动驻留;可手动用 sys.intern() 强制驻留。
  • 能否禁用或修改小整数缓存? 不能。这是 CPython 编译时硬编码的优化,用户层无法更改。试图绕过它(如用 int("257"))仍会生成新对象。

掌握小整数缓存的关键,不在于死记 -5~256,而在于理解其背后的性能动机、明确 is 的语义(对象同一性)、并养成用 == 做数值比较的习惯。这是 Python “显式优于隐式” 和 “实用主义优先” 设计哲学的一个典型缩影。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1559

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1559

2023.10.24

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

286

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

167

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

638

2023.08.03

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号