Skip to content

元组

11186字,阅读约69分钟

Python 除了提供列表外,还有一种特殊的数据结构叫做元组 (Tuple 读作 /ˈtuːpl/)。元组是一种有序的、不可变的数据集合,一旦创建就不能修改其中的元素,这为数据提供了额外的安全性和性能优化。

创建

JavaScript 中没有直接对应的数据结构,最接近的是使用Object.freeze()冻结数组,但这种方式在语法上不够简洁:

Python 的元组创建非常简洁,使用圆括号:

单元素元组的陷阱

创建单元素元组时必须包含逗号,否则 Python 会认为括号只是运算符:

使用构造函数创建

不可变性

这是元组与列表最重要的区别:

但是,如果元组包含可变对象,那些对象本身仍然可以被修改:

访问元素

元组的访问方式与列表完全相同:

长度

与列表一样,使用 len() 函数获取元组长度:

比较

元组比较与列表类似,Python 会逐个比较元素内容。需要注意的是,由于元组的不可变性,Python 可能会对一些简单的元组进行内部优化:

元素查找

使用 innot in 关键字检查元素是否存在:

索引查找

使用 .index() 方法查找元素第一次出现的索引:

计数

使用 .count() 方法统计元素出现次数:

切片

元组支持与列表相同的切片操作:

连接操作

虽然元组不可变,但可以通过连接创建新元组:

重复操作

与字符串和列表类似,Python 元组也支持使用*运算符进行重复操作:

复制

元组的复制特性

由于元组是不可变的,复制操作有特殊的行为:

包含可变对象的元组复制

当元组包含可变对象时,需要注意深拷贝:

解包

元组解包是 Python 多重赋值的重要基础。在前面的列表章节中,我们已经学习了解包的基本概念,元组解包的语法完全相同,但元组更适合用于固定结构的数据:

元组解包的高级用法

元组解包同样支持星号操作符,特别适合处理具有固定开头和结尾的数据:

元组推导式

在列表章节中,我们学习了列表推导式的强大功能。你可能会问:元组有推导式吗?

答案是:元组本身没有推导式语法。使用圆括号的表达式 (expression for item in iterable) 实际上创建的是生成器表达式,而不是元组:

创建元组的正确方式

要创建元组,需要将生成器表达式或其他可迭代对象传递给 tuple() 构造函数:

命名元组

虽然不是本章的重点,但值得了解 Python 还提供了命名元组,让元组更具可读性:

元组 vs 列表的选择

如果数据结构固定且不需要修改(如坐标、配置信息、函数返回的多个值),适合使用元组;如果需要动态添加、删除或修改元素(如购物车、成绩列表),适合使用列表。另外,元组由于不可变性,在内存使用和访问速度上通常比列表更高效。

元组操作一览

元组方法

由于元组的不可变性,它只有很少的方法:

方法功能示例返回值
count(item)统计元素出现次数tup.count('apple')出现次数
index(item)返回元素首次出现的索引tup.index('apple')索引值

内置函数

函数功能示例返回值
len(tup)获取元组长度len((1, 2, 3))长度
max(tup)获取最大值max((1, 2, 3))最大值
min(tup)获取最小值min((1, 2, 3))最小值
sum(tup)计算数值元组的和sum((1, 2, 3))总和
sorted(tup)返回排序后的列表sorted((3, 1, 2))新的排序列表
tuple(iterable)将可迭代对象转为元组tuple([1, 2, 3])新元组

运算符和关键字

操作功能示例返回值
+连接元组(1, 2) + (3, 4)新元组
*重复元组(1, 2) * 3新元组
in检查元素是否存在'apple' in fruits布尔值
not in检查元素是否不存在'apple' not in fruits布尔值
==比较元组内容(1, 2) == (1, 2)布尔值
<, >, <=, >=按字典序比较(1, 2) < (1, 3)布尔值

切片操作

操作功能示例返回值
tup[start:end]切片tup[1:3]新元组
tup[start:end:step]带步长切片tup[::2]新元组
tup[::-1]反转元组tup[::-1]新元组

小结

元组是 Python 中一种重要的不可变序列类型:

  1. 不可变性:一旦创建就不能修改,提供数据安全性和性能优化
  2. 有序性:保持元素的插入顺序,支持索引和切片操作
  3. 混合类型:可以存储不同类型的数据,与列表类似
  4. 解包功能:支持优雅的多重赋值和变量交换
  5. 数据组合:适合将多个相关数据组合成一个整体
  6. 内存效率:比列表占用更少内存,创建和访问更快
  7. 语法简洁:使用圆括号创建,但要注意单元素元组的逗号
  8. 内部优化:Python 可能会对相同内容的简单元组进行优化,使其指向同一对象

选择元组还是列表的关键在于:如果数据结构固定且不需要修改,使用元组;如果需要动态添加、删除或修改元素,使用列表。元组特别适合表示坐标、配置信息、函数返回的多个值等场景。

练习

学校要记录三个班级的基本信息,每个班级包含班级名称、学生人数、班主任姓名。请使用元组的特性完成以下任务:

点击查看参考答案

基于 MIT 许可发布