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 列表:该选谁?

场景

选元组

选列表

数据需要防修改

大量只读数据

(内存小、速度快)

动态增删元素

作为字典键

元组绝不是“鸡肋”的只读列表!它在内存优化、数据安全、高阶解包、函数式编程中都有独特优势。

下回写代码时,不妨多问自己:这里用元组是否更合适?

原文链接:,转发请注明来源!