惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
博客园 - 司徒正美
博客园 - 叶小钗
T
Tailwind CSS Blog
博客园 - Franky
V
V2EX
有赞技术团队
有赞技术团队
美团技术团队
雷峰网
雷峰网
爱范儿
爱范儿
Jina AI
Jina AI
D
DataBreaches.Net
H
Help Net Security
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 箫笛

Tkinter - Entry 输入框组件 Tkinter - Button 组件 Tkinter - Label 组件 Tkinter - tk 变量 Tkinter - 事件与绑定 Tkinter - 几何管理器 Tkinter - 核心概念 Tkinter - 快速开始 Tkinter - 介绍 Python 编程 - 条件表达式 Python 编程 - 星号下划线参数释义 shell 编程 - shell 脚本的交互方式 Python insall - macOS 系统安装python的几种方式 Miniconda - Python 环境管理工具 Tkinter - Python GUI 开发 Python 编程 - 下划线命名的区别 Python 编程 - 元类编程 Python 编程 - 多重继承与MRO Python 编程 - 描述符协议 Python 编程 - 类型注解 Python 编程 - 生成器表达式 Python 编程 - 集合 Python 编程 - 装饰器 Python 编程 - 闭包 Python 编程 - 列表推导式 Python 编程 - 函数式编程 Python 编程 - lambda 函数 Python 编程 - 文件操作 Python 编程 - 输入与输出 Python 编程 - 面向对象编程
Python 编程 - 列表(list)
箫笛 · 2026-06-20 · via 博客园 - 箫笛

在 Python 3 中,list(列表)是一种非常基础且常用的可变序列类型,用于存储一系列有序的元素。下面从基本特性、常用操作、性能及注意事项等方面进行介绍。


1. 核心特性

  • 有序:元素保持插入顺序,可以通过索引访问。
  • 可变:列表创建后可以增、删、改元素。
  • 元素类型任意:一个列表中可以包含不同类型的数据(如整数、字符串、甚至其他列表)。
  • 动态长度:没有固定大小限制,可以根据需要自动扩展或收缩。
  • 可迭代:支持 for 循环、列表推导式等迭代操作。

2. 创建列表

# 空列表
empty = []

# 带初始值
numbers = [1, 2, 3]
mixed = [1, "hello", 3.14, [4, 5]]

# 使用 list() 构造函数
chars = list("abc")   # ['a', 'b', 'c']
ranged = list(range(5))  # [0, 1, 2, 3, 4]

# 列表推导式
squares = [x**2 for x in range(5)]   # [0, 1, 4, 9, 16]

3. 常用操作

3.1 访问与修改

lst = [10, 20, 30, 40]
print(lst[0])    # 10
print(lst[-1])   # 40(负索引从末尾开始)

# 修改元素
lst[1] = 25      # [10, 25, 30, 40]

# 切片(返回新列表)
sub = lst[1:3]   # [25, 30]

3.2 添加元素

lst = [1, 2]
lst.append(3)          # [1, 2, 3](末尾追加)
lst.extend([4, 5])     # [1, 2, 3, 4, 5](合并列表)
lst.insert(1, 99)      # [1, 99, 2, 3, 4, 5](指定位置插入)

3.3 删除元素

lst = [10, 20, 30, 20]
lst.remove(20)         # 删除第一个值为20的元素 -> [10, 30, 20]
popped = lst.pop()     # 弹出并返回最后一个元素(pop(0)可弹出第一个)
del lst[0]             # 删除索引0处的元素
lst.clear()            # 清空列表

3.4 查找与计数

lst = [5, 2, 9, 2]
lst.index(2)           # 返回第一个2的索引 -> 1
lst.count(2)           # 2
2 in lst               # True

3.5 排序与反转

lst = [3, 1, 4]
lst.sort()             # 原地升序 -> [1, 3, 4]
lst.sort(reverse=True) # 原地降序 -> [4, 3, 1]
lst.reverse()          # 原地反转 -> [1, 3, 4]

# 不修改原列表,返回新列表
sorted(lst)            # 升序新列表
list(reversed(lst))    # 反转后的新列表

3.6 复制

a = [1, 2, [3, 4]]
b = a.copy()           # 浅拷贝(内层列表仍是引用)
import copy
c = copy.deepcopy(a)   # 深拷贝(完全独立)

4. 常见操作的时间复杂度

操作 平均情况 说明
lst[i] (索引) O(1)
lst.append(x) O(1) 偶尔需要扩容,但均摊为O(1)
lst.pop() O(1) 弹出末尾元素
lst.pop(i) / insert(i, x) O(n) 需要移动后续元素
del lst[i] O(n)
x in lst O(n) 线性搜索
lst.sort() O(n log n) 使用 Timsort 算法
切片 lst[a:b] O(k) k = b-a,产生新列表

5. 列表推导式(List Comprehension)

一种简洁、高效的生成列表的方式:

# 普通写法
squares = []
for x in range(10):
    squares.append(x**2)

# 列表推导式
squares = [x**2 for x in range(10)]

# 带条件
evens = [x for x in range(20) if x % 2 == 0]

# 嵌套循环
pairs = [(x, y) for x in [1,2] for y in [3,4]]

6. 使用注意事项

  • 浅拷贝陷阱:当列表包含可变对象(如子列表)时,copy()list() 只复制引用,修改内层对象会影响原列表。
  • 作为函数默认参数:避免使用可变默认参数(如 def f(lst=[])),多次调用会共享同一个列表对象。
  • 作为栈和队列append()pop() 可实现栈(LIFO)。若需要高效队列(FIFO),请使用 collections.deque,因为列表的 pop(0) 是 O(n)。
  • 内存占用:列表存储的是对象的引用,每个引用约8字节(64位系统),实际元素占用独立内存。存储大量数值时,可使用 array.arraynumpy.ndarray 节省空间。

7. 与其他类型的对比

类型 可变性 元素类型限制 适用场景
list 可变 任意 通用有序集合
tuple 不可变 任意 不可变的数据集合,字典键
array.array 可变 单一数值类型 内存紧凑,数值运算轻量
numpy.ndarray 可变 单一数值类型 科学计算,向量化操作

8. 总结

  • list 是 Python 中最灵活、最常用的序列容器,适合存储有序且需要频繁修改的任意数据。
  • 掌握索引、切片、追加、插入、删除、排序等核心操作,以及列表推导式,可以高效处理绝大多数数据集合需求。
  • 注意浅拷贝、可变默认参数等常见陷阱,根据场景选择合适的数据结构(如队列用 deque,数值数组用 arraynumpy)。