Python 的内置数据模型可以概括为六大类,覆盖了日常开发中几乎所有的数据结构需求。理解它们的分类和特性,是写出高效、清晰 Python 代码的基础。
下面用一个表格快速总览,后面再逐一展开。
| 类型分类 | 具体类型 | 是否可变 | 典型示例 |
|--------------|----------------------|----------|------------------------------------|
| 数值类型 | int、float、complex、bool | 不可变 | 42、3.14、1+2j、True |
| 序列类型 | str、list、tuple | 部分可变 | "hello"、[1,2,3]、(1,2) |
| 映射类型 | dict | 可变 | {"name": "Alice", "age": 30} |
| 集合类型 | set、frozenset | 部分可变 | {1,2,3}、frozenset({1,2}) |
| None 类型 | NoneType | 不可变 | None |
说明:
bool是int的子类,True和False在数值上等于1和0,但为了表达逻辑状态,通常视为独立类型。
数值类型
int:任意精度的整数。不需要担心溢出,10**100也能正确计算。float:双精度浮点数,遵循 IEEE 754 标准。注意0.1 + 0.2并不精确等于0.3,这是浮点数本身的特性,不是 Python 的 bug。complex:复数类型,用j表示虚部,如z = 3 + 5j。bool:只有True和False两个值,常用作条件判断。任何对象都可以在布尔上下文中求值,空对象(0、""、[]等)视为False。
常用操作:
x = 10 // 3 # 整除 -> 3
y = 10 % 3 # 取模 -> 1
z = round(3.1415, 2) # 四舍五入 -> 3.14
序列类型
序列是按顺序排列的一组元素,支持索引、切片和迭代。
str:不可变文本序列。使用单引号或双引号定义,f"..."进行格式化。
name = "World"
msg = f"Hello {name}!" # Hello World!
list:可变序列,用[]定义,支持增删改查。
items = [1, 2, 3]
items.append(4) # [1,2,3,4]
tuple:不可变序列,用()定义。常用于保护数据不被意外修改,或作为字典的键。
point = (10, 20) # 坐标
序列通用操作:
s = "hello"[1:4] # 切片 -> "ell"
len([1,2,3]) # 长度 -> 3
映射类型:dict
字典存储键值对,键必须可哈希(通常是不可变类型),值任意。自 Python 3.7 起,字典保持插入顺序。
user = {"name": "Alice", "age": 30}
user["email"] = "alice@example.com" # 新增
print(user["name"]) # Alice
常用方法:.get() 安全取值、.keys() / .values() / .items() 遍历键值对、.pop() 删除。
集合类型
set:可变集合,元素唯一且无序,自动去重。支持交、并、差等数学运算。
a = {1, 2, 2, 3} # 实际为 {1,2,3}
b = {3, 4}
print(a & b) # 交集 {3}
frozenset:不可变集合,可哈希,因此可作为字典的键或放进另一个集合中。
None 类型
None 是 NoneType 的唯一值,表示“没有值”或“空”。常用于:
- 函数没有显式返回值时,默认返回
None。 - 变量初始化为“尚未赋值”的占位符。
- 条件判断中作为假值的一种。
def do_nothing():
pass
result = do_nothing()
print(result is None) # True
为什么区分可变与不可变?
这个主题会在下一节(7.3)深入探讨,但这里先点出一个关键现象:
- 可变对象(如
list、dict、set)可以在原地修改内容,多个变量引用同一个对象时互相影响。 - 不可变对象(如
int、str、tuple)一旦创建就不能改变,任何“修改”操作都会产生新对象。
这个区别直接影响函数传参、拷贝行为和哈希特性,是 Python 中最重要的基础概念之一。