Python 中的元组(Tuple)是一种不可变的有序数据集合,用于存储多个元素的序列。与列表(List)类似,但元组一旦创建后无法修改,这种特性使其在特定场景下具有独特优势。
一、核心特性
- 不可变性:创建后元素不能增删改
- 有序性:元素按插入顺序存储
- 允许重复:可存储重复元素
- 异构性:可包含不同类型数据
my_tuple = (1, "apple", 3.14, True)
二、创建元组
1. 直接定义
colors = ("red", "green", "blue")
empty_tuple = () # 空元组
singleton = (5,) # 单元素元组(注意逗号)
2. 类型转换
tuple("hello") # → ('h', 'e', 'l', 'l', 'o')
tuple([1,2,3]) # → (1, 2, 3)
三、常用操作
1. 索引与切片
nums = (10, 20, 30, 40, 50)
nums[0] # → 10(正向索引,从0开始)
nums[-1] # → 50(反向索引,从-1开始)
nums[1:4] # → (20, 30, 40)(切片,左闭右开)
nums[::-1] # → (50, 40, 30, 20, 10)(逆序)
2. 解包(Unpacking)
point = (3, 4)
x, y = point # x=3, y=4
# 高级解包(Python 3.x+)
a, *b, c = (1, 2, 3, 4, 5) # a=1, b=[2,3,4], c=5
四、元组方法
元组仅支持以下不可变操作:
t = (1, 2, 2, 3, 3, 3)
t.count(3) # → 3(统计元素出现次数)
t.index(2) # → 1(首次出现位置)
五、元组 vs 列表
特性 | 元组(Tuple) | 列表(List) |
---|---|---|
可变性 | 不可变 | 可变 |
性能 | 更快(不可变性优化) | 较慢 |
内存占用 | 更小 | 较大 |
适用场景 | 数据保护、函数返回多值 | 动态数据集合 |
作为字典键 | 允许 | 不允许 |
六、高级用法
1. 命名元组(Named Tuple)
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p.x) # → 3(属性访问)
2. 函数返回多值
def get_stats():
return 42, "success", [1,2,3] # 返回元组
result = get_stats()
value, status, data = result # 解包使用
3. 哈希性应用
key = (1, "apple") # 元组可作为字典键
my_dict = {key: "fruit"}
# 列表不能作为字典键(会报错)
# bad_key = [1, "apple"]
七、性能优化
内存效率:
import sys sys.getsizeof(()) # 空元组 → 48字节 sys.getsizeof([]) # 空列表 → 72字节
速度优势:
import timeit # 元组访问速度测试 tuple_time = timeit.timeit('x = (1,2,3); x[1]', number=10000000) # 列表访问速度测试 list_time = timeit.timeit('x = [1,2,3]; x[1]', number=10000000) print(f"Tuple: {tuple_time:.6f}s") # 通常更快 print(f"List: {list_time:.6f}s")
八、常见陷阱
可变元素陷阱:
t = ([1,2], 3) t[0].append(3) # 元组不可变,但内部列表可修改 → t变为([1,2,3],3)
单元素元组语法:
t1 = (5) # 错误!实际是整数5 t2 = (5,) # 正确!单元素元组
九、典型应用场景
保护数据完整性:
# 配置参数(不应被修改) DB_CONFIG = ("localhost", 3306, "admin", "secret")
函数返回多值:
def get_user_info(user_id): return (user_id, "Alice", 25, "alice@example.com")
作为字典键:
cache = { (1, 2): "Result A", (3, 4): "Result B" }
格式化字符串:
coords = (3, 4) f"坐标:({coords[0]}, {coords[1]})" # → "坐标:(3, 4)"
通过合理使用元组,可以在保证数据安全的同时提升程序性能。选择元组还是列表的关键在于:是否需要修改数据。如果数据在创建后不应被修改,优先使用元组。