常用数据结构之元组
基础教学 1 min read

常用数据结构之元组

Blog Author

常用数据结构之元组(Tuple):定义、操作与最佳实践

在前两节课中,我们学习了 Python 中最常用的可变序列——列表。它灵活而强大,适合需要频繁修改数据的场景。但在某些情况下,我们更需要一种稳定、只读、不可更改的容器,来保护数据结构的完整性,这时就轮到另一种**不可变序列——元组(Tuple)**登场了。


🧭 一、什么是元组(Tuple)?

元组是 Python 的一种有序、不可变的数据结构,类似于列表,但一旦定义,其内部的数据就不能被修改。我们可以将其视作“只读版的列表”。

✅ 定义语法

t1 = (35, 12, 98)              # 三元组
t2 = ('骆昊', 45, True, '成都')  # 四元组
t3 = ()                        # 空元组
t4 = ('hello', )              # 一元组(注意逗号!)

⚠️ 注意事项:单元素元组必须加逗号

a = ('hello')    # 实际是 str 类型
b = ('hello', )  # 才是 tuple 类型

🔧 二、元组的常用操作

虽然元组是不可变的,但它仍然支持与列表相同的读操作

🔹 基本操作

print(len(t1))      # 元素个数
print(t1[0])        # 索引访问
print(t2[:2])       # 切片访问
print(12 in t1)     # 成员测试
print(t1 + t2)      # 拼接元组

🔹 循环遍历

for item in t1:
    print(item)

🔹 比较运算(元素逐个比较)

print(t1 == t2)
print(t1 < (36, 10, 99))

实际应用:元组比较可用于版本号比较、时间排序、字典排序键值等场景


📦 三、打包与解包(Packing & Unpacking)

✅ 自动打包(多个值 → 一个元组)

a = 1, 2, 3      # 自动打包成元组
print(a)         # (1, 2, 3)

✅ 自动解包(元组 → 多个变量)

x, y, z = a

✅ 星号表达式(可变参数解包)

t = (1, 2, 3, 4, 5)
a, *b = t         # a = 1, b = [2, 3, 4, 5]
a, *b, c = t      # a = 1, b = [2, 3, 4], c = 5

实战应用:可用于“跳过头尾”、“解构函数返回值”、“简洁处理不定长数据”。


🔁 四、交换变量值的 Python 式写法

✅ 两个变量交换

a, b = 3, 5
a, b = b, a

✅ 多个变量循环赋值

a, b, c = 1, 2, 3
a, b, c = b, c, a  # 循环左移

📌 最佳实践:在数据变换、算法设计中常用于“变量轮换”、“队列迁移”等。


🧪 五、元组 vs 列表:谁更适合你的场景?

特性 列表(List) 元组(Tuple)
可变性 ✅ 可变 ❌ 不可变(定义后不能改)
元素操作 支持增删改查 只支持查找和遍历
执行效率 较慢(需额外内存与逻辑) 更快(内存与性能友好)
使用场景 临时数据、可修改集合 常量集合、配置参数
线程安全性 ❌ 容易被更改 ✅ 不可变更适合并发场景
存储开销 相对较大 更小,构建更快

⏱ 创建速度测试(timeit 模块)

import timeit


print('List:', timeit.timeit('[1,2,3,4,5,6,7,8,9]', number=10_000_000))
print('Tuple:', timeit.timeit('(1,2,3,4,5,6,7,8,9)', number=10_000_000))

输出样例(取决于硬件):

List: 0.635 
Tuple: 0.078 

🔁 六、列表与元组的相互转换

✅ tuple → list

t = (1, 2, 3)
lst = list(t)

✅ list → tuple

lst = ['a', 'b']
t = tuple(lst)

场景应用

  • 如果原本是配置项,建议用元组(不允许被改);
  • 如果后续要进行增删,建议用列表;
  • 多线程共享数据,优先元组;
  • 作为 dict 的键,必须用不可变类型,如元组。

💡 七、真实应用场景举例

场景 用法与说明
函数返回多个值 return x, y, z 返回一个元组,调用时自动解包
不可变键结构 dict[{x, y}] 报错,但可以用 dict[(x, y)]
数据库记录 SQL 查询结果往往是元组类型,适合遍历读取但不可修改
枚举坐标 for i, j in [(0, 1), (1, 2), (2, 3)] 是二维迭代常用写法

🎯 总结归纳

  • 元组是不可变的有序序列,适合用于不希望数据被修改的场景。
  • 解包语法让 Python 在多变量赋值上极具简洁性;
  • 使用星号表达式,可以实现灵活的“剩余值处理”;
  • 在并发、高性能场景中,元组比列表更合适;
  • 可以互转,开发中推荐“配置用 tuple、处理用 list”。

📌 一句话记住

“元组用于安全地保存数据,列表用于灵活地处理数据。”


如需打印版笔记、课后练习题或下一节课程(字符串、字典或集合结构),请回复关键词:

  • 字符串
  • 字典
  • 集合

我会继续为你整理成系统教学文稿。