Python3 元组

Python3 学习笔记 · 整理自菜鸟教程

一句话

元组(tuple)是有序、不可变的序列,用圆括号 () 定义,适合存放不会被修改的数据,可作字典键和集合元素。

要点

  • 不可变:创建后不能增删改元素;但元组内若含可变对象(如列表),该对象内容仍可改。
  • 单元素语法:必须带逗号,(5,) 是元组,(5) 只是整数 5。
  • 可省略括号t = 1, 2, 3 等价于 (1, 2, 3)
  • 解包(unpacking)a, b = (1, 2);星号收集 a, *rest = (1, 2, 3)
  • 只有两个方法count()index(),因为不可变所以没有增删方法。
  • 可与列表互转tuple(lst) / list(tup)list 能改,tuple 不能。
  • 可哈希:元素均可哈希时,元组可作 dict 的键、set 的元素。

语法 / 常用方法

语法/方法 说明 示例
t = (1, 2, 3) 定义元组 也可 t = 1, 2, 3
t = (5,) 单元素元组(必须逗号) (5) 不是元组
t = () 空元组
t[i] / t[a:b] 索引 / 切片(返回新元组) (1,2,3)[1:](2,3)
t.count(x) x 出现次数 (1,1,2).count(1) → 2
t.index(x) 首个 x 的下标 (1,2).index(2) → 1
len(t) 元素个数 len((1,2)) → 2
x in t 是否包含 2 in (1,2) → True
t1 + t2 拼接成新元组 (1,) + (2,)(1,2)
t * n 重复 n 次 (0,) * 3(0,0,0)
a, b = t 解包 x, y = (1, 2)
a, *rest = t 星号收集剩余 a, *r = (1,2,3)a=1, r=[2,3]
tuple(iter) 其他可迭代对象转元组 tuple([1,2])(1,2)
max(t) / min(t) / sum(t) 最大 / 最小 / 求和 sum((1,2,3)) → 6
del t 删除整个元组变量 不能删单个元素

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# ---- 创建 ----
t = (1, 2, 3)
print(type(t)) # <class 'tuple'>
t2 = 4, 5, 6 # 省略括号
print(t2) # (4, 5, 6)
empty = ()
single = (5,) # 单元素必须带逗号
print(type(single)) # <class 'tuple'>

# ---- 索引 / 切片 ----
print(t[0], t[-1]) # 1 3
print(t[1:3]) # (2, 3) 切片返回新元组

# ---- 不可变 ----
try:
t[0] = 100
except TypeError as e:
print("不可修改:", e) # 'tuple' object does not support item assignment

# 但元组内的可变对象可以改内容
m = (1, [2, 3], 4)
m[1].append(99) # 改列表内容,合法
print(m) # (1, [2, 3, 99], 4)

# ---- 解包 ----
a, b, c = t
print(a, b, c) # 1 2 3
x, *rest = (1, 2, 3, 4)
print(x, rest) # 1 [2, 3, 4]

# ---- 交换变量(元组解包)----
u, v = 1, 2
u, v = v, u
print(u, v) # 2 1

# ---- 方法 ----
print(t.count(1)) # 1
print(t.index(2)) # 1
print(len(t), max(t), sum(t)) # 3 3 6

# ---- 元组作字典键 ----
point = (3, 4)
grid = {point: "原点偏移"}
print(grid[(3, 4)]) # 原点偏移

# ---- 与列表互转 ----
lst = list(t) # [1, 2, 3],可修改
back = tuple(lst) # 再转回元组
print(lst, back)

易错点

  • 单元素元组漏逗号(5) 是 int,(5,) 才是元组。
  • “不可变”不等于内层不可变:元组里放列表,列表内容仍能改(浅不可变)。
  • 元组里放不可哈希对象t = (1, [2]) 不能作字典键,因为列表不可哈希。
  • 切片返回新元组,不是共享视图;与列表切片一致。
  • del t 删的是变量引用,不能 del t[0](报 TypeError)。
  • 不加括号的陷阱t = 1, 是元组;t = 1 是整数。