Python元组:你以为它只是只读的列表?它可比你想象的更强大!
提到Python中的元组(tuple),很多人第一反应是:“哦,就是那个不能改的列表嘛!”
但如果你只把它当“只读列表”用,可就大材小用了!
今天,我们就来扒一扒元组的隐藏技能和超实用场景,看完你一定会惊呼:原来元组还能这么玩!
1 元组:不只是「不可变」的列表
元组的不可变性是它的核心标签,但这背后藏着更多秘密:
- 内存更省:Python会为元组分配连续内存,且不可变性让它能被缓存复用,内存效率远超列表。
- 速度更快:元组的元素访问速度比列表快约5%~20%,尤其是在数据量大的场景下。
- 可哈希(Hashable):所有元素不可变的元组,能直接当字典的键!列表却不行。
反直觉操作:
元组不可变,但如果它的元素是可变对象(比如列表),你依然可以修改这个元素!
t = (1, 2, [3, 4])
t[2].append(5) # 合法!元组的第三个元素是列表,可以修改
print(t) # (1, 2, [3, 4, 5])
2 元组的高级玩法
单元素元组的“坑”
想创建一个只有1个元素的元组?必须加逗号!否则Python会误判类型。
t = (1) # 这是整数,不是元组!
t = (1,) # 这才是元组
解包与打包
元组支持“一行代码拆解数据”,还能用*号玩转灵活解包:
# 解包赋值
x, y, z = (10, 20, 30)
# 扩展解包(Python 3.5+)
first, *rest = (1, 2, 3, 4) # rest = [2, 3, 4]
# 函数返回多个值
def get_user_info():
return "张三", 28, "python@example.com"
name, age, email = get_user_info()
命名元组:代码可读性飙升
用collections.namedtuple创建带字段名的元组,告别无意义的索引!
from collections import namedtuple
# 定义一个“点”结构
Point = namedtuple("Point", ["x", "y"])
p = Point(10, y=20)
print(p.x, p.y) # 输出:10 20
3 元组的绝佳应用场景
当字典的键
用元组存储多维坐标、复合键值,轻松实现高效查询:
locations = {
(35.6, 139.7): "东京",
(40.7, -74.0): "纽约"
}
print(locations[(35.6, 139.7)]) # 输出:东京
函数参数传递
用*args接收可变参数时,参数会被打包成元组:
def calculate_sum(*numbers):
return sum(numbers)
calculate_sum(1, 2, 3) # numbers = (1, 2, 3)
数据保护与常量
配置文件、数据库查询结果等需要“防手滑修改”的数据,用元组更安全!
4 元组 vs 列表:该选谁?
场景 | 选元组 | 选列表 |
数据需要防修改 | ||
大量只读数据 | (内存小、速度快) | |
动态增删元素 | ||
作为字典键 |
元组绝不是“鸡肋”的只读列表!它在内存优化、数据安全、高阶解包、函数式编程中都有独特优势。
下回写代码时,不妨多问自己:这里用元组是否更合适?