




















在 Python 3 中,元组(Tuple)是一个不可变的有序元素序列。它是 Python 最基础的数据结构之一,与列表(List)齐名,但核心区别在于创建后不可修改。
以下是关于 Python 3 元组最全面的知识点总结,包含大量实用示例:
(),元素用逗号隔开。# 空元组
t1 = ()
# 多元素
t2 = (1, 2, 3)
# 重要:单元素元组(必须加逗号)
t3 = (5,) # 类型为 <class 'tuple'>
t4 = (5) # 类型为 <class 'int'>,只是整数5
# 省略括号(逗号是关键)
t5 = 1, 2, 3 # 结果 (1, 2, 3)
这是元组与列表最本质的区别。 一旦创建,你不能增删改其中的元素。
t = (1, 2, 3)
# t[0] = 100 # 会抛出 TypeError: 'tuple' object does not support item assignment
注意:如果元组内的元素是可变对象(如列表),该列表本身可以修改,但元组对该列表的引用(内存地址)不可变。
t = (1, [2, 3])
t[1].append(4) # 合法!t 变成 (1, [2, 3, 4])
0开始)和反向(-1开始)。+ 和 *(注意会生成新对象)。in / not in。t = (10, 20, 30, 40, 50)
print(t[1]) # 20
print(t[-1]) # 50
print(t[1:4]) # (20, 30, 40)
print(t + (60,)) # (10, 20, 30, 40, 50, 60)
print(20 in t) # True
由于不可变,元组的方法极少:
| 方法 | 说明 |
|---|---|
count(x) |
统计元素 x 在元组中出现的次数 |
index(x) |
查找元素 x 首次出现的索引(不存在则抛出 ValueError) |
t = (1, 2, 2, 3)
print(t.count(2)) # 2
print(t.index(3)) # 3
*rest 可以收集剩余元素。# 打包
data = "Alice", 25, "Engineer"
# 解包(变量数量必须匹配)
name, age, job = data
print(name) # Alice
# 星号解包(匹配任意长度)
first, *middle, last = (1, 2, 3, 4, 5)
print(first) # 1
print(middle) # [2, 3, 4] (注意:结果是列表)
print(last) # 5
| 特性 | 元组 (Tuple) | 列表 (List) |
|---|---|---|
| 可变性 | 不可变(线程安全,数据稳定) | 可变 |
| 内存占用 | 更小(Python 解释器会做内存优化) | 较大 |
| 执行速度 | 创建和访问稍快 | 稍慢 |
| 使用场景 | 字典的键(Key)、函数返回多值、配置常量 | 动态数据集合 |
| 哈希性 | 若内部元素均可哈希,则元组本身可哈希 | 不可哈希,不能作为字典键 |
# 元组可作为字典键,列表不行
d = {("lat", "lon"): 100} # 合法
# d = {["lat", "lon"]: 100} # TypeError
Python 3 的 collections.namedtuple 可以创建带有字段名的元组,兼顾元组的轻量性和类的可读性。Python 3.7+ 还支持类型注解。
from collections import namedtuple
# 定义一个名为 Point 的元组类
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x) # 10(支持属性访问)
print(p[0]) # 10(支持索引访问)
print(p) # Point(x=10, y=20)
在 Python 3.9+ 中,tuple 可以直接用于泛型类型提示;Python 3.11 优化了元组的解包性能。
# 类型注解(Python 3.9+)
def get_user() -> tuple[str, int]:
return ("Bob", 30)
a, b = b, a(底层就是元组打包与解包)。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。