常用数据结构之元组
# 常用数据结构之元组
## 元组 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 的便利特性,可用于变量交换
- 列表和元组的选择原则:**数据会变用列表,数据不变用元组**