讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 内置类型缓存机制详解

梦芳大大_6566

梦芳大大_6566

发布时间:2026-01-27 19:32:03

|

541人浏览过

|

来源于php中文网

原创

小整数(-5~256)和短字符串能用 is 比较,因 CPython 预缓存这些对象,字面量赋值时指向同一内存;但该行为不跨实现/版本保证,应优先用 == 判断相等,is 仅用于身份比较(如 is None)。

python 内置类型缓存机制详解

小整数和短字符串为什么能用 is 比较?

因为 Python 对一部分内置对象做了「缓存复用」,不是每次创建都分配新内存。比如 -5 到 256 的整数、长度较短的标识符风格字符串(如 "hello"),解释器启动时就预创建好并放进全局缓存池。所以 a = 100; b = 100; a is b 返回 True —— 它们指向同一对象。

但这个行为只适用于 CPython 实现,且不保证跨版本一致;更关键的是,它仅在「字面量直接赋值」或「编译期可确定」的场景生效。比如:

a = 1000
b = 1000
a is b  # 可能为 False(超出小整数范围)
<p>s1 = "hello world"
s2 = "hello world"
s1 is s2  # 通常为 True(短字符串驻留)</p><p>s3 = "hello" + " " + "world"  # 编译期拼接,仍驻留
s4 = "hello world" * 1  # 运行时计算,通常不驻留
  • 不要依赖 is 判断数值或字符串相等,一律用 ==
  • 字符串驻留(interning)受 sys.intern() 控制,也受编译器优化影响,不能当作稳定特性使用
  • is 应仅用于判断是否为同一个对象(如 obj is None)

id() 和 is 在缓存对象上的表现一致性

id() 返回对象在内存中的地址(CPython 中是实际指针值),而 is 的语义就是 id(a) == id(b)。所以只要两个变量指向缓存池里的同一个预分配对象,id() 就必然相同,is 也返回 True。

但注意:缓存对象一旦被垃圾回收(极罕见,因缓存池对象生命周期与解释器一致),其 id 可能被后续新对象复用 —— 所以 id 值本身不可持久化存储或跨时间比较。

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

arcgis-js
arcgis-js

提供 ArcGIS Maps SDK for JavaScript 开发辅助,涵盖 2D/3D 地图视图、图层管理、数据可视化、空间分析等功能模块的参考和示例指导。

下载
  • 缓存对象的 id 在整个程序运行期间稳定,但仅限于该对象存活期内
  • 不要把 id() 当作唯一标识符用于序列化、日志追踪等场景
  • is 的结果可预测,id() 的数值含义仅对当前运行实例有效

哪些类型有缓存?哪些没有?

CPython 明确实现缓存的主要是:

  • 小整数:-5 至 256(含),定义在 Objects/longobject.c 中的 small_ints 数组
  • 单字符字符串:所有 ASCII 字母、数字、下划线(即符合标识符首字符规则的单字符)
  • 部分短字符串:编译期常量、无空格/特殊字符的短串(如 "__name__"),由编译器触发 PyUnicode_InternInPlace

以下类型**没有**内置缓存机制:

  • 浮点数(1.0 is 1.0 为 True 是巧合,源于编译器常量折叠,非缓存)
  • 列表、字典、集合等可变类型(即使内容相同,每次 [] 都新建对象)
  • 长字符串(如 "a" * 1000)、含空格或 Unicode 的字符串(除非显式 sys.intern())
  • 自定义类实例(无论 __eq__ 如何实现,is 总是 False)

缓存机制对性能和内存的实际影响

缓存本质是空间换时间:避免重复分配、减少 GC 压力、加快对象创建。对小整数来说,效果显著——每秒百万级的 int 创建几乎零开销;对字符串驻留,则大幅降低字典键查找时的哈希与比较成本(尤其在大量重复 key 的场景,如 JSON 解析)。

但副作用也很明确:

  • 启动时多占几 KB 内存(小整数池约 312 个对象,字符串驻留表初始为空,随需增长)
  • 驻留字符串会阻止其被回收,哪怕只在局部作用域短暂使用过
  • 过度依赖驻留可能掩盖逻辑错误(例如误用 is 导致测试通过但线上失败)

真正需要干预缓存行为的场景极少。如果确实要控制字符串驻留,用 sys.intern() 即可,但必须确保传入的是不可变字符串,且调用时机在首次创建后、被其他引用持有前。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2255

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3642

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1216

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4199

2025.09.10

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

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

6284

2023.10.24

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

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

16800

2023.12.04

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

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

1203

2024.02.23

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

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

9150

2025.06.11

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn