0

0

Python 内置类型缓存机制详解

冷炫風刃

冷炫風刃

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

|

501人浏览过

|

来源于php中文网

原创

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

python 内置类型缓存机制详解

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

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

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

a = 1000
b = 1000
a is b  # 可能为 False(超出小整数范围)

s1 = "hello world" s2 = "hello world" s1 is s2 # 通常为 True(短字符串驻留)

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免费学习笔记(深入)”;

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

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

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

网奇Cwms企业网站程序1.0 1
网奇Cwms企业网站程序1.0 1

网奇CWMS企业网站管理系统 Company Website Manage System采用微软 ASP.NET2.0(C#) 设计,使用分层设计模式,页面高速缓存,是迄今为止国内最先进的.NET语言企业网站管理系统。整套系统的设计构造,完全考虑大中小企业类网站的功能要求,网站的后台功能强大,管理简捷,支持模板机制。使用国际编码,通过xml配置语言,一套系统可同时支持任意多语言。全站可生成各类模拟

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

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

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

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

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

但副作用也很明确:

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

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

418

2023.08.07

json是什么
json是什么

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

535

2023.08.23

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

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

311

2023.10.13

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

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

77

2025.09.10

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

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

1498

2023.10.24

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

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

183

2023.12.04

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

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

286

2024.02.23

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

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

258

2025.06.11

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

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

精品课程

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

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

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