Python 元组(Tuple):高效且不可变的数据结构
在 Python 中,元组(tuple)是一种不可变(immutable)的序列类型,适用于存储不希望被修改的数据。相比于列表(list),元组占用更少的内存,且访问速度更快(faster access speed),因此在数据量较大、要求稳定性的场景(scenarios requiring stability)下,元组是一个不错的选择。
1 元组的创建(Tuple Creation)
元组可以使用圆括号(parentheses)创建,也可以直接用逗号(,)分隔多个值:
# 使用括号创建元组
t1 = (1, 2, 3, 4)
# 省略括号,直接用逗号
t2 = 5, 6, 7
# 创建单个元素的元组(注意逗号,否则会变成普通数据类型)
t3 = (10,)
t4 = 10 # 这不是元组,而是整数
# 使用 tuple() 构造函数
t5 = tuple([1, 2, 3]) # 将列表转换为元组
t6 = tuple("hello") # 字符串拆分成元组
注意: 如果元组中只有一个元素,必须加一个逗号(comma),否则 Python 认为它是普通变量。
2 元组的访问(Tuple Access)
元组支持索引(indexing)和切片(slicing),类似于列表(list)。
t = (10, 20, 30, 40, 50)
# 通过索引获取元素(Indexing)
print(t[0]) # 输出:10
print(t[-1]) # 输出:50(倒数第一个元素)
# 通过切片获取部分元素(Slicing)
print(t[1:3]) # 输出:(20, 30)
print(t[:3]) # 输出:(10, 20, 30)
print(t[::2]) # 输出:(10, 30, 50) # 步长为2
索引超出范围(out of range)会报错,而列表切片不会。
3 元组的不可变性(Immutability)
元组的最大特点是不可变(immutable),即创建后无法修改。
t = (1, 2, 3)
# 尝试修改元组中的元素(会报错)
t[0] = 100 # TypeError: 'tuple' object does not support item assignment
但如果元组中的可变对象(mutable object)被修改,整个元组仍然保持不变。
t = ([1, 2], [3, 4]) # 元组中的元素是列表(可变)
t[0].append(99)
print(t) # 输出:([1, 2, 99], [3, 4])
元组不可变,但内部的可变对象仍然可以更改!
4 元组的解包(Tuple Unpacking)
元组支持解包(unpacking),可以将元组中的元素赋值给多个变量。
# 直接解包
a, b, c = (1, 2, 3)
print(a, b, c) # 输出:1 2 3
# 交换变量
x, y = 5, 10
x, y = y, x
print(x, y) # 输出:10 5
# 使用 * 号收集多余元素
first, *middle, last = (10, 20, 30, 40)
print(first, middle, last) # 输出:10 [20, 30] 40
注意: 操作符可以收集多个元素,返回一个列表。
5 元组 vs. 列表(Tuple vs. List)
特性 | 元组(Tuple) | 列表(List) |
是否可变(Mutable) | 不可变 | 可变 |
访问速度(Speed) | 快 | 略慢 |
内存占用(Memory) | 小 | 略大 |
适用场景(Usage) | 数据固定、不变的情况 | 数据需要修改的情况 |
如果数据不会变动,建议使用元组(tuple),否则使用列表(list)。
6 常见操作(Common Operations)
Python 提供了一些常用的方法来操作元组:
t = (10, 20, 30, 40, 20)
# 统计元素个数
print(t.count(20)) # 输出:2
# 获取元素索引
print(t.index(30)) # 输出:2
# 判断元素是否在元组中
print(50 in t) # 输出:False
元组方法很少,主要提供 count() 和 index(),不像列表那样丰富。
7 什么时候用元组?(When to Use Tuple?)
数据不会改变时:如数据库查询结果、配置项(configuration)、地理坐标(coordinates)等。
作为字典的键(Keys in Dictionary):因为元组是哈希化(hashable)的,而列表不能作为字典的键。
data = {(35.6895, 139.6917): "Tokyo", (40.7128, -74.0060): "New York"}
print(data[(35.6895, 139.6917)]) # 输出:Tokyo
提高性能(Performance Optimization):元组比列表更快,占用更少的内存。
import sys
a = (1, 2, 3)
b = [1, 2, 3]
print(sys.getsizeof(a), sys.getsizeof(b)) # 元组占用更少的内存
总结(Summary)
- 元组是不可变的(Immutable),比列表更快,占用更少内存。
- 支持索引(index)、切片(slicing)、解包(unpacking)。
- 可作为字典的键(Keys in Dict),适用于不变的数据。
- 元组的方法较少,主要有 count() 和 index()。
- 数据不会变动时,推荐使用元组(Tuple)。
这样,你学会 Python 元组了吗?