# 常用数据结构之元组 ## 元组 vs 列表 元组和列表一样用于存储多个元素,核心区别在于:**列表可变,元组不可变**。 | 特性 | 列表 | 元组 | |------|------|------| | 可变性 | 可修改 | 不可修改 | | 语法 | `[1, 2, 3]` | `(1, 2, 3)` | | 创建速度 | 慢 | 快(约10倍) | | 适用场景 | 需要频繁增删 | 数据不需要修改 | ## 创建元组 ```python t1 = (35, 12, 98) # 四元组 t2 = ('骆昊', 45, True, '成都') # 空元组 a = () # 一元组(必须加逗号) b = ('hello',) # 正确 c = ('hello') # 错!这是字符串 ``` ## 元组运算 元组支持索引、切片、拼接、成员运算——与列表完全相同: ```python t = (35, 12, 98, 45) print(t[0]) # 35 print(t[-1]) # 98 print(t[1:3]) # (12, 98) print(len(t)) # 4 print(12 in t) # True print(t + (1, 2)) # (35, 12, 98, 45, 1, 2) ``` ## 打包与解包 **打包**:多个值赋给一个变量,自动组成元组: ```python a = 1, 10, 100 # 打包成元组 (1, 10, 100) ``` **解包**:元组赋值给多个变量: ```python t = (1, 10, 100) i, j, k = t # i=1, j=10, k=100 ``` **星号表达式**(接收剩余元素为列表): ```python a, b, *c = (1, 10, 100, 1000) print(a, b, c) # 1 10 [100, 1000] *i, j = (1, 10, 100, 1000) print(i, j) # [1, 10, 100] 1000 ``` > **注意**:星号表达式只能出现一次。 ## 交换变量 Python 独有语法,无需临时变量: ```python a, b = b, a # 交换a和b a, b, c = b, c, a # 循环交换三个变量 ``` ## 列表与元组转换 ```python infos = ('骆昊', 45, True) print(list(infos)) # 元组→列表 frts = ['apple', 'banana'] print(tuple(frts)) # 列表→元组 ``` ## 为什么需要元组 1. **性能**:创建元组比列表快约10倍,适合存储常量数据 2. **线程安全**:不可变类型天然适合多线程环境 3. **可作为字典键**:元组可哈希,列表不行 ```python # 性能对比 import timeit print(timeit.timeit('[1,2,3,4,5]', number=10000000)) # ~0.6秒 print(timeit.timeit('(1,2,3,4,5)', number=10000000)) # ~0.08秒 ``` ## 总结 - 元组是不可变的列表,支持所有列表的读取操作 - `()` 定义元组,一元组必须加逗号 - 解包语法是 Python 的便利特性,可用于变量交换 - 列表和元组的选择原则:**数据会变用列表,数据不变用元组**