Python Tuple 元组的CURD
本文聚焦 Python 元组的核心操作与不可变性,包含增删改查四大基础操作与详细复杂度分析。
我也将给出个人思维导图

一、增(Create)
元组创建后不可修改,因此"增"只能通过拼接创建新元组。
1.1 基础创建方式
python
# 空元组
empty = ()
# 或
empty = tuple()
# 多个元素
nums = (1, 2, 3)
nums = 1, 2, 3 # 省略括号(逗号才是关键)
# 单个元素(必须有逗号)
single = (1,) # 正确:元组
wrong = (1) # 错误:这只是整数 1
# 验证类型
type((1,)) # <class 'tuple'>
type((1)) # <class 'int'>
注意 :逗号
,才是创建元组的关键,括号()只是辅助。
1.2 从可迭代对象创建
时间复杂度 O(n)(n 为可迭代对象长度)。
python
# 从列表创建
t = tuple([1, 2, 3])
# (1, 2, 3)
# 从字符串创建
t = tuple('hello')
# ('h', 'e', 'l', 'l', 'o')
# 从 range 创建
t = tuple(range(3))
# (0, 1, 2)
1.3 拼接("增加"元素)
元组不可变,只能通过拼接创建新元组,时间复杂度 O(n+m)。
python
t1 = (1, 2)
t2 = (3, 4)
# 拼接返回新元组
result = t1 + t2
# (1, 2, 3, 4)
# 原元组不变
print(t1) # (1, 2)
注意:拼接创建新元组,而非原地修改。频繁拼接会有性能问题。
二、查(Read)
元组的访问方式与列表完全相同。
2.1 索引访问
通过下标获取元素,时间复杂度 O(1)。
python
t = ('a', 'b', 'c', 'd')
# 正向索引
first = t[0] # 'a'
third = t[2] # 'c'
# 负向索引(倒数)
last = t[-1] # 'd'
second_last = t[-2] # 'c'
2.2 切片访问
获取子元组,时间复杂度 O(k)(k 为切片长度)。
python
t = (0, 1, 2, 3, 4, 5)
# 基础切片 [start:stop]
t[1:4] # (1, 2, 3)(含头不含尾)
# 步长切片 [start:stop:step]
t[::2] # (0, 2, 4)(每隔一个)
t[::-1] # (5, 4, 3, 2, 1, 0)(反转)
# 省略参数
t[:3] # (0, 1, 2)(从头开始)
t[3:] # (3, 4, 5)(到末尾结束)
2.3 成员检测与查找
python
t = (10, 20, 30, 20)
# 存在性检测 - O(n)
20 in t # True
50 not in t # True
# 查找索引 - O(n),返回第一个匹配
t.index(20) # 1
t.index(20, 2) # 3(从索引 2 开始搜索)
# 统计出现次数 - O(n)
t.count(20) # 2
三、改(Update)
元组不可修改 ,没有 append、insert、extend 等方法。
3.1 不可变性示例
python
t = (1, 2, 3)
# 尝试修改元素 - 报错
t[0] = 10
# TypeError: 'tuple' object does not support item assignment
# 尝试添加元素 - 报错
t.append(4)
# AttributeError: 'tuple' object has no attribute 'append'
# 尝试删除元素 - 报错
del t[0]
# TypeError: 'tuple' object doesn't support item deletion
警告:元组一旦创建就无法修改,这是其与列表的核心区别。
3.2 变通方法:切片拼接
通过切片和拼接创建新元组,时间复杂度 O(n)(非原地修改)。
python
t = (1, 2, 3, 4, 5)
# 目标:把索引 2 的元素 3 替换为 99
# 方法:切片 + 拼接
t = t[:2] + (99,) + t[3:]
# (1, 2, 99, 4, 5)
# 注意:这是创建新元组,不是原地修改
注意:这实际上创建了新元组,而非修改原元组。
四、删(Delete)
元组不可删除元素,只能删除整个元组。
4.1 删除整个元组
python
t = (1, 2, 3)
# 删除整个元组
del t
# print(t) # NameError: name 't' is not defined
4.2 无法删除单个元素
python
t = (1, 2, 3)
# 无法删除单个元素
del t[0] # TypeError: 'tuple' object doesn't support item deletion
# 没有 remove 方法
t.remove(1) # AttributeError: 'tuple' object has no attribute 'remove'
# 没有 pop 方法
t.pop() # AttributeError: 'tuple' object has no attribute 'pop'
警告:元组不支持任何形式的元素删除操作。
五、元组 vs 列表
| 特性 | 列表 list |
元组 tuple |
|---|---|---|
| 可变性 | 可变 | 不可变 |
| 语法 | [1, 2, 3] |
(1, 2, 3) |
| 创建方法 | append/insert |
只能拼接新元组 |
| 修改元素 | lst[0] = x |
不允许 |
| 删除元素 | pop/remove/del |
不允许 |
| 哈希 | 不可哈希 | 可哈希(元素可哈希时) |
5.1 可变性对比
python
# 列表:可修改
lst = [1, 2, 3]
lst[0] = 10 # [10, 2, 3]
lst.append(4) # [10, 2, 3, 4]
del lst[1] # [10, 3, 4]
# 元组:不可修改
t = (1, 2, 3)
t[0] = 10 # TypeError
t.append(4) # AttributeError
del t[0] # TypeError
5.2 使用场景
python
# 列表:需要修改的数据
scores = [85, 92, 78]
scores.append(95) # 可添加
scores.remove(78) # 可删除
# 元组:固定数据、字典键
# 作为字典键(可哈希)
locations = {
(40.7, -74.0): 'New York',
(51.5, -0.1): 'London'
}
# 列表无法作为字典键
# locations = {[40.7, -74.0]: 'New York'} # TypeError
六、操作复杂度总结
| 操作 | 方法 | 平均复杂度 | 说明 |
|---|---|---|---|
| 创建 | tuple() |
O(n) | 需要复制所有元素 |
| 拼接 | t1 + t2 |
O(n+m) | 创建新元组 |
| 索引访问 | t[i] |
O(1) | 直接内存寻址 |
| 切片访问 | t[i:j] |
O(k) | k 为切片长度 |
| 成员检测 | x in t |
O(n) | 线性扫描 |
| 索引查找 | t.index(x) |
O(n) | 线性扫描 |
| 计数 | t.count(x) |
O(n) | 遍历统计 |
| 修改元素 | 不允许 | - | 元组不可变 |
| 删除元素 | 不允许 | - | 元组不可变 |