Python入门:认识列表和元组

小岛来信
小岛来信
发布时间:2026-10-12| 3人浏览过
原创

本文深入解析Python中列表和元组的特性、存储机制及性能差异。列表动态可变,支持增删改,但占用内存较多;元组静态不可变,轻量且性能略优,适合固定数据。文章通过代码示例对比两者的操作方式、内置函数及底层存储开销,帮助开发者根据数据是否可变及性能需求选择合适的数据结构。

列表和元组均属于有序集合,能够容纳任意数据类型的数据元素。

列表的特性

列表具有动态性(mutable),其长度不固定,允许用户自由地增加、删除或修改其中的元素。

对列表元素的修改会直接作用于原列表,而不会生成一个新的列表对象。

# 新建一个列表
l = [1, 2, 'hello', 'world']
# 输出列表
l
# 显示内容
[1, 2, 'hello', 'world']
# 访问列表元素
l[3] = 3 # 列表允许访问第4个元素,并修改
# 输出列表
l
# 显示内容
[1, 2, 'hello', 3]
# 添加元素
l.append(5) # 把元素5 添加到列表后面
# 输出列表
l
# 显示内容
[1, 2, 'hello', 3, 5]

元组的特性

元组具有静态性(immutable),其长度固定,不支持增加、删除或修改内部元素的操作。

若需改变元组中的数据,必须开辟新的内存空间,并创建一个全新的元组。

# 新建一个元组
tup = ('jason', 22)
# 输出元组
tup
# 显示内容
('jason', 22)
# 不能对元组直接操作,需要新建一个新元组
net_tup = tup + (5, ) # 创建新的元组new_tup 后,以此填充元素,新增元素后的',' 不可以省略
# 输出元组
net_tup
# 显示内容
('jason', 22, 5)

两者支持的操作

负数索引

列表和元组均支持负数索引机制,其中 -1 代表倒数第一个元素,-2 代表倒数第二个,依此类推。

l = [1, 2, 'hello', 3, 5]
l[-1] # 列表的负数索引
# 显示内容
5
tup = ('jason', 22)
tup[-1] # 元组的负数索引
# 显示内容
22

切片操作

切片操作用于提取指定范围 [start : end] 内的所有元素,结果包含起始索引对应的元素,但不包含结束索引对应的元素。

例如,表达式 [0:3] 表示从下标 0 开始取值,直至下标 2(即 3-1)结束。

l = [1, 2, 'hello', 3, 5]
l[0:3] # 列表的切片操作
# 显示内容
[1, 2, 'hello']
tup = ('jason', 22)
tup[0:2] # 元组的切片操作
# 显示内容
('jason', 22)

随意嵌套

new_l = [[1, 2, 3], [4, 5]] # 嵌套列表
new_l
# 显示内容
[[1, 2, 3], [4, 5]]
new_tup = ((1, 2, 3,), (4, 5, 6)) # 嵌套元组
new_tup
# 显示内容
((1, 2, 3), (4, 5, 6))

相互转换

list((1, 2, 3)) # list() 函数把元组转化成列表
tuple([1, 2, 3]) # tuple() 函数把列表转化成元组

常用内置函数

count(item) 用于统计列表或元组中指定 item 出现的次数。

  • index(item) 返回列表或元组中 item 第一次出现的索引位置。
  • list.reverse() and list.sort() 只能对列表应用
    • list.reverse() 用于将列表原地倒转。
    • list.sort() 用于对列表进行排序。
  • reversed() and sorted()
    • reversed() 对列表 / 元组进行倒转
      • 返回一个倒转后的迭代器,使用 list() 将其转换成列表
  • sorted() 对列表 / 元组进行排序
    • 返回排好序的新列表

存储方式的差异

l = [1, 2, 3]
l.__sizeof__()
64
tup = (1, 2, 3)
tup.__sizeof__()
48

在存储相同内容时,列表比元组多占用 16 字节。

  • 由于列表是动态的,需要指针来指向对应的元素。
  • 列表可变,因此需要额外存储已分配的长度信息,以追踪列表空间的使用情况,当空间不足时,可及时分配额外空间。
  • 存储指针的空间长度各为 8 字节。

列表初始空间为 40 字节,添加字符后会扩展 4 个元素的空间(32 字节),总计 72 字节。当需要存储的元素空间大于当前存储空间时,列表会新增 4 个元素的空间(32 字节)。

这种增加/删减操作机制(over-allocating)保证了操作的有效性,使得增加/删减的时间复杂度均为 O(1)。

性能对比

元组比列表更加轻量级,从总体来看,元组的性能速度略优于列表。

Python 会在后台对静态数据执行资源缓存(resource caching)。

垃圾回收机制会在变量不再被使用时,回收其占用的内存并返还给操作系统,供其他变量或应用使用。

但当元组不被使用且占用空间较小时,Python 会暂时缓存这部分内存。下次调用时,Python 直接复用该缓存空间,从而大幅加快程序运行速度。

初始化包含相同元素的列表和元组时,元组的创建速度比列表快 5 倍。

在索引操作上,两者的速度差异极小,几乎可以忽略不计。

在增加/删减或改变元素方面,列表表现更优。而元组因不可变特性,需新建一个元组来实现变更。

两者的使用场景

若存储的数据及其数量保持不变,选用元组更为合适;若存储的数据或数量可能发生变动,则选择列表更合适。

总结

列表和元组都是有序的集合,可以存储任何数据类型的数据。

区别:

列表是动态的,长度可变,支持增加、删除、修改元素,但存储空间略大于元组,性能略逊于元组。

元组是静态的,长度固定,不支持对元素进行直接操作。元组相对于列表更加轻量级,性能稍优。

提问:两个创建空列表的方法,哪个更快。

# option A
empty_list = list()
# option B
empty_list = []

自答:我认为 option B 更快一些,因为它直接创建了一个空列表。而 option A 是通过 list() 进行转换的。

解答:[] 是一个内置的 C 函数,被直接调用。而 list 是一个函数调用(function call),Python 的函数调用会创建栈帧(stack),并进行一系列参数检查操作,相对较为耗时(expensive)。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本站的更多内容!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。