python中没有“引用数据类型”这一官方分类,一切变量均为对象引用,行为差异取决于可变性而非继承;不可变类型(如int、str、tuple)修改时创建新对象,可变类型(如list、dict)支持原地修改且id不变。

Python 中没有“引用数据类型”这个官方分类概念,它常见于 Java 或 C# 等语言中,用来区分基本类型与对象类型的内存传递方式。Python 一切皆对象,所有变量都是对象的引用,所以更准确的说法是:**所有数据类型本质上都是对象,其行为差异取决于可变性与类继承结构**。
Python 的核心类型继承层级
Python 所有内置类型都直接或间接继承自 object,它是整个类型系统的根。关键继承路径如下:
- object → type(所有类的类型,即元类)
- object → int、float、bool(数值类型)
- object → str、bytes、bytearray
- object → list、tuple、range(序列类型)
- object → dict、set、frozenset(集合与映射类型)
注意:str、tuple、frozenset 是不可变类型;list、dict、set 是可变类型——这种差异不来自继承链本身,而由其实现决定(比如是否提供 __setitem__ 或 append 等方法)。
可变 vs 不可变:不是继承决定的,而是行为定义的
是否可变,取决于类是否允许就地修改自身状态:
- 不可变类型(如 str、tuple):调用
.upper()或+ 'x'会返回新对象,原对象不变 - 可变类型(如 list、dict):调用
.append()或[key] = val直接修改原对象内存内容
这种区别在源码中体现为是否实现可变操作协议(如 __iadd__、__setitem__),而非继承自某个“MutableBase”类。
用户自定义类的继承关系图解
当你写 class Dog(Animal):,实际建立的是:
- Dog ← 继承 ← Animal ← 继承 ← object
- 可通过
Dog.__bases__查看直接父类(返回元组) - 可通过
issubclass(Dog, Animal)或isinstance(d, Animal)验证继承关系
多继承时(如 class Hybrid(Bird, Mammal):),方法解析顺序(MRO)按 C3 算法确定,可用 Dog.mro() 查看完整继承链。
为什么没有“引用类型”图?
因为 Python 中:
- 变量不存储值,只保存对对象的引用(类似指针,但自动管理)
- 赋值、参数传递、返回值,都是引用传递(但对不可变对象效果像值传递)
- 是否共享同一对象,取决于你操作的是可变对象还是不可变对象,而不是类型属于哪一类“引用类型”
真正影响行为的是对象的可变性 + 是否被多个变量引用,而不是类型名前有没有“Ref”字样。











