首页 / Python3 入门教程 / 元组与序列

Python3 入门教程

元组与序列

本教程共 70 篇 · 第 13 篇 · 更新于 2026-07-22 · 约 4 分钟阅读

PythonPython3 入门教程Python 元组打包解包namedtuple序列类型

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 元组」等,改写后所得。