Python中'=='与'is'的区别及对象缓存机制详解

巷口听风
巷口听风
发布时间:2026-10-14| 6人浏览过
原创

本文深入解析Python中'=='与'is'运算符的核心区别,重点剖析小整数对象池([-5~256])、大整数通用对象池以及字符串Intern机制的工作原理。通过具体代码示例,阐明不同数据类型在内存分配与对象复用上的差异,帮助开发者避免常见的内存地址比较误区。

'=='与'is'的核心区别

'=='运算符用于比较两个对象的值是否相等。

'is'运算符用于比较两个对象的内存地址(即id)是否相同。

接下来重点解析'is'运算符背后的机制,这涉及小整数对象池、大整数对象池以及字符串的Intern机制。

小整数对象池机制

小整数池:Python预先创建了一个小整数缓存池,范围覆盖[-5~256]。无论创建多少个该范围内的整数对象,它们都指向同一个内存地址,这样设计的目的是避免对小整数进行频繁的内存申请和释放操作,从而提升性能。

```python >>> a=3 >>> b=3 >>> a is b True >>> 1+2 is 3 True ```

```python >>> a=1.0 >>> b=1.0 >>> a is b False ```

大整数对象池与通用内存池

大整数对象池:Python提供了一个可扩展的内存空间,称为通用整数对象池。该池由PyIntBlock结构组成,通过单向链表连接多个内存块(block),并由block_list维护。每个block内部维护一个整数对象数组(Objects),用于存放被缓存的大整数对象。处于同一个内存块内的大整数对象被视为同一对象,从而免去额外的内存申请开销。

```python >>> def func(): ... a=10.1 ... b=10.1 ... return a is b ... >>> func() True ```

在上述函数中,变量a和b的赋值均从同一个通用整数池项中获取,因此它们指向同一对象。

字符串Intern机制详解

Intern机制:Python的字符串类型中存在一个名为interned的字典,用于记录字符串对象。该机制保证具有相同值的字符串在内存中唯一,即相同值的字符串会复用同一个对象。

需要注意的是,Intern机制仅对由字母、数字和下划线组成的字符串生效。如果字符串包含其他字符(如空格),则不会进行Intern处理。

```python >>> a='abc' >>> b='abc' >>> a is b True ```

```python >>> a='ab c' >>> b='ab c' >>> a is b False ```

其他数据类型的对象创建特性

此外,Python中的其他数据类型,如字典(dict)、列表(list)和集合(set)等,每次创建时都会生成不同的对象,即使内容相同,它们的内存地址也不同。

```python >>> a=[1,2,3] >>> b=[1,2,3] >>> a is b False >>> a={'a':1} >>> b={'a':1} >>> a is b False >>> ```

内存复用与垃圾回收示例

补充说明:出现上述内存地址相同的情况,是因为前一个列表[1,2,3]被垃圾回收后,其占用的内存空间被重新分配给了新的列表[4,5,6]。

```python >>> id([1,2,3]) == id([4,5,6]) True >>> id([1,2,3]) 36200264L >>> id([4,5,6]) 36200264L ```

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。