元组与序列
本教程共 70 篇 · 第 13 篇 · 更新于 2026-07-22 · 约 4 分钟阅读
13. 元组与序列
本节目标:理解元组的不可变性,掌握打包解包技巧,了解序列类型的共同特点。
元组是什么
元组(tuple)和列表很像,都是有序集合。唯一区别是:元组一旦创建就不能修改。
>>> t = (1, 2, 3)
>>> t[0]
1
>>> t[0] = 99
TypeError: 'tuple' object does not support item assignment
创建元组用圆括号,元素之间逗号分隔:
t = (1, 2, 3)
Warning定义只有一个元素的元组时,逗号不能省:
>>> t = (1) # 这是整数 1,不是元组 >>> type(t) <class 'int'> >>> t = (1,) # 这才是元组 >>> type(t) <class 'tuple'>括号在这里有歧义,逗号才是元组的标志。
元组能做什么
因为元组不可变,所以它比列表更安全。如果数据不需要修改,优先用元组:
# 坐标点
point = (3, 4)
# RGB 颜色
color = (255, 128, 0)
# 数据库记录
record = ("Alice", 25, "Engineer")
元组可以作为字典的键(因为字典要求键不可变),列表不行:
>>> locations = {(0, 0): "原点", (1, 0): "东边"}
>>> locations[(0, 0)]
'原点'
元组的方法
元组不可变,所以方法很少:
>>> t = (1, 2, 3, 2)
>>> t.count(2) # 统计出现次数
2
>>> t.index(3) # 返回索引
2
>>> len(t) # 长度
4
>>> 2 in t # 判断是否存在
True
索引、切片、+、*、in,这些操作跟列表完全一样。
打包与解包
把多个值打包成一个元组:
>>> t = 1, 2, 3 # 括号可以省略
>>> t
(1, 2, 3)
把元组拆开赋值给多个变量:
>>> t = (1, 2, 3)
>>> a, b, c = t
>>> a
1
>>> b
2
>>> c
3
解包时两边数量必须一致,否则报错。用 * 可以收集剩余元素:
>>> first, *rest = [1, 2, 3, 4]
>>> first
1
>>> rest
[2, 3, 4]
>>> first, *middle, last = [1, 2, 3, 4]
>>> middle
[2, 3]
Tip交换两个变量的值,Python 的惯用写法就是打包解包:
a, b = b, a优雅、简洁、没有临时变量。
序列类型的共同特点
列表、元组、字符串都属于「序列类型」(sequence type),它们有很多共同的操作:
| 操作 | 说明 |
|---|---|
s[i] | 索引取元素 |
s[i:j] | 切片 |
s[i:j:k] | 带步长的切片 |
len(s) | 长度 |
min(s), max(s) | 最小/最大值 |
s + t | 拼接 |
s * n | 重复 |
x in s | 判断成员 |
x not in s | 判断是否不在 |
for x in s | 迭代 |
这些操作在列表、元组、字符串上都能用,只是返回结果的类型不同。
namedtuple(命名元组)
当元组元素多了之后,用 t[0]、t[1] 容易混淆含义。collections.namedtuple 可以给每个位置起名字:
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(3, 4)
print(p.x) # 3
print(p.y) # 4
print(p[0]) # 3,仍然支持索引
namedtuple 兼具元组的不可变性和类的可读性,适合表示简单的数据结构。Python 3.7+ 更推荐使用 dataclasses,后面章节会介绍。
可变元组?
元组的「不可变」有个细节要注意:元组存储的是元素的引用,引用不能改,但引用指向的对象本身可以变。
>>> t = ("a", "b", ["A", "B"])
>>> t[2][0] = "X"
>>> t
('a', 'b', ['X', 'B'])
内层的列表被修改了,但元组本身没变——它始终指向这 3 个对象。要创建真正「内容不变」的元组,确保所有元素本身也是不可变的。
Tip如果你发现元组里的列表被改了,说明设计时该用列表而不是元组。不可变容器里放可变元素,往往意味着类型选错了。
来源:参考了 runoob「Python3 元组」、liaoxuefeng「使用 list 和 tuple」、w3cschool「Python3 序列」「Python3 元组」等,改写后所得。