在 Python 3 中,元组(Tuple)是一个不可变的有序元素序列。它是 Python 最基础的数据结构之一,与列表(List)齐名,但核心区别在于创建后不可修改。
以下是关于 Python 3 元组最全面的知识点总结,包含大量实用示例:
1. 创建元组
- 标准语法:使用圆括号
(),元素用逗号隔开。 - 关键陷阱(单元素元组):必须加尾随逗号,否则 Python 会把它当作普通运算优先级括号。
- 省略括号:逗号才是元组的真正定义者。
# 空元组
t1 = ()# 多元素
t2 = (1, 2, 3)# 重要:单元素元组(必须加逗号)
t3 = (5,) # 类型为 <class 'tuple'>
t4 = (5) # 类型为 <class 'int'>,只是整数5# 省略括号(逗号是关键)
t5 = 1, 2, 3 # 结果 (1, 2, 3)
2. 核心特性:不可变性(Immutable)
这是元组与列表最本质的区别。 一旦创建,你不能增删改其中的元素。
t = (1, 2, 3)
# t[0] = 100 # 会抛出 TypeError: 'tuple' object does not support item assignment
注意:如果元组内的元素是可变对象(如列表),该列表本身可以修改,但元组对该列表的引用(内存地址)不可变。
t = (1, [2, 3])
t[1].append(4) # 合法!t 变成 (1, [2, 3, 4])
3. 访问与操作
- 索引:支持正向(
0开始)和反向(-1开始)。 - 切片:返回新的元组。
- 拼接与重复:
+和*(注意会生成新对象)。 - 成员检查:
in/not in。
t = (10, 20, 30, 40, 50)
print(t[1]) # 20
print(t[-1]) # 50
print(t[1:4]) # (20, 30, 40)
print(t + (60,)) # (10, 20, 30, 40, 50, 60)
print(20 in t) # True
4. 内置方法(仅 2 个)
由于不可变,元组的方法极少:
| 方法 | 说明 |
|---|---|
count(x) |
统计元素 x 在元组中出现的次数 |
index(x) |
查找元素 x 首次出现的索引(不存在则抛出 ValueError) |
t = (1, 2, 2, 3)
print(t.count(2)) # 2
print(t.index(3)) # 3
5. 元组打包与解包(核心语法糖)
- 打包:将多个值赋给一个元组变量。
- 解包:将元组元素赋值给多个变量。
- 星号表达式(Python 3 特有):
*rest可以收集剩余元素。
# 打包
data = "Alice", 25, "Engineer"# 解包(变量数量必须匹配)
name, age, job = data
print(name) # Alice# 星号解包(匹配任意长度)
first, *middle, last = (1, 2, 3, 4, 5)
print(first) # 1
print(middle) # [2, 3, 4] (注意:结果是列表)
print(last) # 5
6. 为什么使用元组?(与列表对比)
| 特性 | 元组 (Tuple) | 列表 (List) |
|---|---|---|
| 可变性 | 不可变(线程安全,数据稳定) | 可变 |
| 内存占用 | 更小(Python 解释器会做内存优化) | 较大 |
| 执行速度 | 创建和访问稍快 | 稍慢 |
| 使用场景 | 字典的键(Key)、函数返回多值、配置常量 | 动态数据集合 |
| 哈希性 | 若内部元素均可哈希,则元组本身可哈希 | 不可哈希,不能作为字典键 |
# 元组可作为字典键,列表不行
d = {("lat", "lon"): 100} # 合法
# d = {["lat", "lon"]: 100} # TypeError
7. 命名元组(NamedTuple)—— 进阶必备
Python 3 的 collections.namedtuple 可以创建带有字段名的元组,兼顾元组的轻量性和类的可读性。Python 3.7+ 还支持类型注解。
from collections import namedtuple# 定义一个名为 Point 的元组类
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)print(p.x) # 10(支持属性访问)
print(p[0]) # 10(支持索引访问)
print(p) # Point(x=10, y=20)
8. Python 3.11+ 最新特性(类型提示)
在 Python 3.9+ 中,tuple 可以直接用于泛型类型提示;Python 3.11 优化了元组的解包性能。
# 类型注解(Python 3.9+)
def get_user() -> tuple[str, int]:return ("Bob", 30)
💡 最佳实践建议
- 当数据不需要修改时,优先使用元组(更安全、更高效)。
- 利用解包交换变量:
a, b = b, a(底层就是元组打包与解包)。 - 函数返回多个值时,默认就是元组,可以直接解包接收。
