侧边栏壁纸
博主头像
phphi

phphi's blog

  • 累计撰写 51 篇文章
  • 累计收到 0 条评论

Day10 - 常用数据结构之元组

2026-4-24 / 0 评论 / 1 阅读

常用数据结构之元组

元组 vs 列表

元组和列表一样用于存储多个元素,核心区别在于:列表可变,元组不可变

特性 列表 元组
可变性 可修改 不可修改
语法 [1, 2, 3] (1, 2, 3)
创建速度 快(约10倍)
适用场景 需要频繁增删 数据不需要修改

创建元组

t1 = (35, 12, 98)                    # 四元组
t2 = ('骆昊', 45, True, '成都')

# 空元组
a = ()

# 一元组(必须加逗号)
b = ('hello',)   # 正确
c = ('hello')    # 错!这是字符串

元组运算

元组支持索引、切片、拼接、成员运算——与列表完全相同:

t = (35, 12, 98, 45)
print(t[0])           # 35
print(t[-1])          # 98
print(t[1:3])          # (12, 98)
print(len(t))          # 4
print(12 in t)         # True
print(t + (1, 2))      # (35, 12, 98, 45, 1, 2)

打包与解包

打包:多个值赋给一个变量,自动组成元组:

a = 1, 10, 100   # 打包成元组 (1, 10, 100)

解包:元组赋值给多个变量:

t = (1, 10, 100)
i, j, k = t     # i=1, j=10, k=100

星号表达式(接收剩余元素为列表):

a, b, *c = (1, 10, 100, 1000)
print(a, b, c)   # 1 10 [100, 1000]

*i, j = (1, 10, 100, 1000)
print(i, j)      # [1, 10, 100] 1000

注意:星号表达式只能出现一次。

交换变量

Python 独有语法,无需临时变量:

a, b = b, a                    # 交换a和b
a, b, c = b, c, a              # 循环交换三个变量

列表与元组转换

infos = ('骆昊', 45, True)
print(list(infos))              # 元组→列表

frts = ['apple', 'banana']
print(tuple(frts))              # 列表→元组

为什么需要元组

  1. 性能:创建元组比列表快约10倍,适合存储常量数据
  2. 线程安全:不可变类型天然适合多线程环境
  3. 可作为字典键:元组可哈希,列表不行
# 性能对比
import timeit
print(timeit.timeit('[1,2,3,4,5]', number=10000000))  # ~0.6秒
print(timeit.timeit('(1,2,3,4,5)', number=10000000))  # ~0.08秒

总结

  • 元组是不可变的列表,支持所有列表的读取操作
  • () 定义元组,一元组必须加逗号
  • 解包语法是 Python 的便利特性,可用于变量交换
  • 列表和元组的选择原则:数据会变用列表,数据不变用元组