Python数据模型与对象模型核心解析:身份、类型与值

沈亦白
沈亦白
发布时间:2026-10-14| 4人浏览过
原创

本文深入解析Python数据模型(即对象模型)的核心概念,详细阐述对象的三大要素:身份(identity)、类型(type)和值(value)。文章区分了强类型与动态类型的概念,解释了可变与不可变对象的内存行为,并探讨了Python垃圾回收机制及资源管理最佳实践,帮助开发者深入理解Python对象底层逻辑。

数据模型与对象模型

在Python官方文档中,这一概念被称为“Python数据模型”,而大多数Python书籍作者则习惯称其为“Python对象模型”。两者指代的是同一概念,即计算机编程语言中对象的属性。这一表述可能显得较为抽象,但只需理解对象是Python对数据的抽象形式,且在Python中“万物皆对象”即可。

官方文档的严谨定义指出,Python程序中的所有数据均通过对象或对象之间的关系来表示。

对象三要素

每个对象都包含三个基本要素:编号(identity)、类型(type)和值(value)。

identity

编号即对象的内存地址,一旦对象创建,该地址便固定不变。可以使用is运算符来比较两个对象的编号是否相同,或者通过id()函数获取对象编号的整数表示。

identity也可翻译为“身份”或“对象身份”。

type

类型决定了对象支持的操作范围,并定义了对象可能的取值。例如,int和bool类型的值存在显著差异。可以通过type()函数来返回对象的类型。许多人误认为Python是弱类型语言,但实际上Python属于强类型语言。这种误解源于Python无需编译,也不需要在定义变量时预先指定类型,而是在运行时进行类型检查,因此更准确的描述是Python为动态类型语言。

以JavaScript为例,它是弱类型语言,在Python中执行1+"2"会报错,而在JavaScript中则能成功运行。

对象的类型在创建后同样不会改变。虽然可以进行类型转换,但转换过程实际上会生成一个新的对象:


a = 1
print(id(a))
print(id(str(a)))
print(id(a))

结果为:


140715000207008
2136059506160
140715000207008

value

在对象三要素中,唯有值是可以改变的。官方文档中有一句看似正确的陈述:允许改变值的对象被称为mutable(可变的),而不允许改变值的对象被称为immutable(不可变的)。这里的难点在于,当不可变对象的值是对可变对象的引用时,如何判断对象的可变性?结论是:不可变对象仍然是不可变的,因为其引用的指向不能改变。然而,我们通常会认为该不可变对象的值是可变的,尤其是当涉及对象容器时。对象类型也决定了其可变性,例如numbers、strings、tuples是不可变的,而dictionaries、lists是可变的。

对象容器

某些对象包含对其他对象的引用,这被称为containers对象容器,例如tuples、lists、dictionaries。在大多数情况下,当我们讨论容器的值时,指的是被引用对象的值,而非引用编号本身。但在讨论容器的可变性时,仅指容器直接包含的引用编号是否可变。例如,tuple是不可变的,但如果它包含了对一个可变对象的引用,当该可变对象的内容发生改变时,容器的“值”也会随之改变。

对象回收

对象不会被显式销毁,而是由Python的垃圾回收机制自动处理。只要不存在对对象的引用,该对象就会被视为垃圾并回收。垃圾回收机制较为复杂,涉及循环引用等算法规则,这将在后续关于Python原理的文章中进一步探讨。

Python的垃圾回收机制并非万能,无法解决所有问题。因此,在引用外部资源(如打开文件)时,需要注意显式调用close,以防止资源始终占用内存导致内存泄漏。除了手动调用close()方法外,还可以使用with语句来自动执行close操作。

需要注意的是,使用try...except结构可能会导致对象在异常处理后继续存活。

类型决定一切

对象的类型几乎决定了对象的所有行为,甚至影响对象编号的分配。例如,对于不可变类型:


a = 1
b = 1

变量a和b可能会指向同一个值为1的对象,也可能指向两个不同的值为1的对象,这具体取决于Python的实现细节。

而对于可变类型:


c = []
d = []

变量c和d一定会指向两个不同的、单独的空列表对象。

需要注意的是,c = d = [] 这种写法是将同一个对象赋值给c和d。

小结

Python数据模型即常说的对象模型,遵循“万物皆对象”的原则,每个对象包含编号、类型和值三个要素。深入理解对象模型后,Python的另一个重要概念——数据结构,便随之浮现。

参考资料:

https://docs.python.org/3/reference/datamodel.html

以上就是Python数据模型与Python对象模型的相关总结的详细内容,更多关于python数据模型与对象模型的资料请关注本站其它相关文章!

相关标签:

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

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 算法库。