Python中的对象池与驻留机制:小整数、字符串与大整数

news/2025/10/6 12:32:57/文章来源:https://www.cnblogs.com/wangya216/p/19127490

Python中的对象池与驻留机制:小整数、字符串与大整数

Python为优化内存使用和执行效率,设计了多种对象复用机制,其中最典型的是小整数对象池字符串驻留(intern)机制大整数对象池。以下是整理后的详细说明,包含规则、示例及修正补充:

一、小整数对象池

定义

Python对使用频率极高的小整数采用预创建对象池的策略,避免频繁创建和销毁相同整数对象,从而提升性能。

核心规则

  1. 范围固定:小整数对象池包含的整数范围是 [-5, 256]。这些整数在Python解释器启动时就被预先创建,且不会被垃圾回收机制回收。
  2. 全局复用:在程序的任何位置(无论LEGB作用域),只要使用该范围内的整数,引用的都是同一个对象。
  3. 与字符串的区别:单个字母的复用属于字符串驻留机制(见下文),而非小整数对象池的范畴,二者不可混淆。

示例

# 范围内的整数:复用同一对象
a = -5
b = -5
print(a is b)  # True(-5在[-5,256]范围内)a = 256
b = 256
print(a is b)  # True(256是范围上限)# 范围外的整数:每次创建新对象
a = 257
b = 257
print(a is b)  # False(257超出范围)a = -6
b = -6
print(a is b)  # False(-6超出范围)

注意事项

  • 小整数对象池是Python解释器的硬性规则,不受执行环境(终端、IDE)影响。
  • 范围外的整数(如257、-6)不享受池化,每次使用都会创建新对象。

二、字符串驻留(intern)机制

定义

字符串驻留是通过维护一个“字符串储蓄池”(字典结构),复用相同内容的字符串对象,从而节省内存的优化机制。

核心规则

1. 自动驻留的条件(Python 3.7+)

  • 内容符合“标识符规则”:仅包含字母(a-z, A-Z)、数字(0-9)、下划线(_)。
  • 编译期可确定:必须是字面量或字面量拼接(如'a'+'b'),编译时可确定结果。
  • 无长度限制:Python 3.7起移除了20字符的长度限制,只要符合标识符规则,无论长度如何都会自动驻留。
  • 空字符串:空字符串''始终被驻留(复用率极高)。

2. 不自动驻留的情况

  • 含特殊符号:字符串包含空格、标点等非标识符字符(如'hello world''a-b')。
  • 运行时动态生成:依赖变量、函数返回值等动态拼接的字符串(如a + 'b',其中a是变量)。

3. 手动驻留

对不符合自动驻留条件但需复用的字符串,可通过sys.intern(s)手动加入驻留池:

import syss1 = 'hello world'  # 含空格,不自动驻留
s2 = 'hello world'
print(s1 is s2)  # Falses1_interned = sys.intern(s1)
s2_interned = sys.intern(s2)
print(s1_interned is s2_interned)  # True(手动驻留后复用)

4. IDE特殊情况

PyCharm等IDE可能对短字符串(无论是否符合标识符规则)进行额外驻留优化(如'hello world'在IDE中可能被驻留),但这是环境特性,非Python原生规则。测试时建议使用命令行运行。

示例

# 符合标识符规则的字面量:自动驻留
s1 = "abc123"
s2 = "abc123"
print(s1 is s2)  # True# 字面量拼接(编译期确定):自动驻留
s3 = "ab" + "cd"  # 编译为"abcd"
s4 = "abcd"
print(s3 is s4)  # True# 含特殊符号:不自动驻留
s5 = "hello world"  # 含空格
s6 = "hello world"
print(s5 is s6)  # False(命令行环境)# 动态拼接(运行期生成):不自动驻留
s7 = "hell"
s8 = s7 + "o"  # 运行时拼接
s9 = "hello"
print(s8 is s9)  # False# 长度无限制(Python 3.7+)
s10 = "a" * 1000  # 长字符串,符合标识符规则
s11 = "a" * 1000
print(s10 is s11)  # True

注意事项

  • is用于判断是否为同一对象(比较内存地址),==用于比较值是否相等,实际开发中应优先使用==
  • 字符串不可变,拼接时推荐用join()(仅创建1个对象)而非+(多次创建对象)。

三、大整数对象池

定义

大整数指超出小整数范围([-5, 256])的整数。Python对大整数的复用机制与执行环境和代码块相关,无固定范围,仅在特定条件下复用对象。

核心规则

  1. 代码块内复用:在同一代码块中(如同一脚本、函数、类定义内),值相同的大整数会被复用为同一对象。
  2. 代码块间隔离:不同代码块(如不同函数、不同类)中的相同大整数会被视为不同对象。
  3. 执行环境差异
    • 终端(交互式环境):每次输入为一个独立代码块,因此相同大整数不会复用(每次创建新对象)。
    • IDE(如PyCharm):整个脚本作为一个代码块,同一代码块内的大整数会复用。

示例

1. 终端(交互式环境)

# 每次输入是独立代码块,大整数不复用
>>> a = 1000
>>> b = 1000
>>> a is b
False>>> c = -1888
>>> d = -1888
>>> c is d
False# 同一代码块内的大整数:复用
>>> def f():
...     a=1000
...     b=1000
...     print(a is b)
...
>>> f()
True
>>>

2. PyCharm(同一脚本,单代码块)

# 同一代码块内的大整数:复用
c1 = 1000
d1 = 1000
print(c1 is d1)  # True# 类定义属于独立代码块,类内变量为类代码块的一部分
class C1:c = 1000d = 1000  # 同一类代码块内,复用class C2:b = 1000  # 与C1属于不同代码块,不复用print(C1.c is C1.d)  # True(同一类代码块)
print(C1.c is C2.b)  # False(不同类代码块)

注意事项

  • 大整数对象池的行为完全依赖代码块划分,无固定范围,与小整数对象池的全局复用机制不同。
  • 开发中无需依赖大整数的复用特性,因环境差异可能导致结果不一致。

总结

机制 适用对象 核心规则 复用范围
小整数对象池 整数 范围固定为[-5, 256],解释器启动时预创建,全局复用 全程序(不受作用域/代码块影响)
字符串驻留机制 字符串 符合标识符规则的编译期字面量自动驻留,动态生成需手动驻留 驻留池内全局复用
大整数对象池 超出[-5,256]的整数 同一代码块内复用,不同代码块隔离,受执行环境影响 仅限同一代码块

三者的核心目的都是通过复用对象优化内存和性能,但适用场景和规则各有不同,开发中需注意其特性差异,避免依赖隐性规则导致bug。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA

1.算法运行效果图预览 (完整程序运行后无水印)2.算法运行软件版本 matlab2024b3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)global MR%表示接收天线的数量 global MT%表示发射天线的数量 global mods…

厦门做返利网站的公司室内设计培训网课

1、# 创建数据库语句create database mydb default character set utf8;# 运用数据库语句use mydb;# 创建表格,这里只简单的创建一张表格# 设置InnoDB主要是为了事务操作的需要create table mytable(id int primary key auto_increment,name varchar(20),count int …

python网站开发 django沈阳网站哪家公司做的好

1. escape 和 unescapeescape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。采用unicode字符集对指定的字符串除0-255以外进行编码。所有的空格符、标点符号、特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在…

微服务各个部分的作用 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

US$34.2 KEYDIY KD B27-3 Universal Flip Remote 3 Buttons for Audi Type 5pcs/lot

KEYDIY KD B27-3 Universal Flip Remote 3 Buttons for Audi Type 5pcs/lotProduct Specifications:Manufacturer: KEYDIY Condition: New Color: Black Buttons: 3 Transponder: No Proximity / Smart / Keyless Go: …

郴州网站建设公司电话不备案域名能用吗

网络安全和内容交付网络(CDN)之间有着密切的关系。网络安全主要涉及保护网络和系统免受各种威胁和攻击,而CDN是一种用于提供更快速、高效和可靠的内容交付服务的技术。在当今数字化和云计算时代,网络安全和CDN之间的关系变得更加紧…

网站导航图怎么做的详细步骤wordpress默认分类链接

1 帐号管理、认证授权 1.1 账号管理 1.1.1 ELK-Huawei-01-01-01 编号: ELK-Huawei-01-01-01 名称: 无效帐户清理 实施目的: 删除与设备运行、维护等工作无关的账号 问题影响: 账号混淆,权限不明确&#…

计算机网站开发要考什么证网站文章怎么做才能被收录

目录 一、准备工作 1.环境相关 2.Unity中配置 二、热更新 1.创建 HotUpdate 热更新模块 2.安装和配置HybridCLR 3.配置PlayerSettings 4.创建热更新相关脚本 5.打包dll 6.测试热更新 一、准备工作 1.环境相关 安装git环境。Win下需要安装visual studio 2019或更高版…

点乘与叉乘的由来:从四元数到公理自洽的启示

一、背景:从实数到高维数的追求 人类在数学史上不断尝试扩展“数”的概念:实数用于度量线上的长度; 复数将数延伸到平面,引入虚数单位 (i),满足 (i^2 = -1)。哈密顿(William Rowan Hamilton)在19世纪中叶尝试将…

【算法深练】分组循环:“分”出条理,化繁为简 - 教程

【算法深练】分组循环:“分”出条理,化繁为简 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

网站建设竞争对数分析江苏建设集团招聘信息网站

1.2 中国高等级自动驾驶发展近况 通过对中国高等级自动驾驶行业的观察和分析,亿欧汽车认为,除技术解决方案提供商外,如今的车企、政府、资本同样在产业链中扮演重要角色。此外,车路协同技术的发展也为高等级自动驾驶的发展提供了更…

java学习日记10.5

运算符 优先级 最高括号 ( ) [ ] 后缀自增/自减 i++/i--单目运算符前缀自增/自减、正负号、按位取反、逻辑非 i++/i--、+/-、~、!强制类型转换 (int)算术运算符乘、整除、求模 *、/、% 加、减 +、-位运算符与移…

US$34.2 KEYDIY KD B11-3 Universal Flip Remote Key 3 Buttons for PSA Type 5pcs/lot

KEYDIY KD B11-3 Universal Flip Remote Key 3 Buttons for PSA Type 5pcs/lotProduct Specifications:Manufacturer: KEYDIY Condition: New Color: Black Buttons: 3 Panic: No Transponder: No Proximity / Smart /…

帮做简历哪个网站好国内最新新闻摘抄30字

关于JavaScript中日期对象使用方法: 一般有两种设置时间的方式: 一种是直接指定,如:date.setHours(13);    //指定date的时间为下午1点。 第二种是先获取时间进行计算,然后再进行设置,如: d…

【JNI】JNI基础语法

1 C 和 C++ 在 JNI 中的区别 ​ JNI环境搭建 中介绍了在命令行和 Android Studio 中如何编译 JNI 代码,本文将介绍 JNI 的基础语法,主要介绍 JNI 的数据类型、JNI 与 Java 交互、异常处理,参考了 JNI 官方文档,…

面试题——计算机网络:HTTP和HTTPS的区别? - 教程

面试题——计算机网络:HTTP和HTTPS的区别? - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

【EF Core】通过 DbContext 选项扩展框架

本来老周计划在 10 月 1 日或 2 日写这篇水文的,没打算出去玩(确实没啥好玩)。不过因为买的运动相机到手,急着想试试效果,于是就备了些干粮,骑着山地车在外面鬼混了一天。10 月 2 日,家里来了三位热爱学习的小妹…

从Chrome渲染器代码执行到内核:MSG_OOB漏洞分析与利用

本文详细分析了Linux内核中MSG_OOB特性的安全漏洞(CVE-2025-38236),探讨了如何从Chrome渲染器沙箱中利用该漏洞实现从用户态代码执行到内核权限提升的完整攻击链,包括漏洞原理、利用技术和沙箱逃逸方法。从Chrome渲染…

assistant-ui

assistant-ui. https://langgraph.com.cn/cloud/how-tos/use_stream_react/index.htmluseStream() React hook 提供了一种将 LangGraph 无缝集成到 React 应用程序中的方式。它处理了流式传输、状态管理和分支逻辑的所…

婚纱网站怎么做临淄区最新招聘信息

grpc 与 protobuf grpc 使用的是 protobuf 协议,其是一个通用的 rpc 框架,基本支持主流的所有语言、其底层使用 http/2 进行网络通信,具有较高的效率 protobuf 是一种序列化格式,这种格式具有 序列化以及解码速度快(…