在 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.array或numpy.ndarray节省空间。
7. 与其他类型的对比
| 类型 | 可变性 | 元素类型限制 | 适用场景 |
|---|---|---|---|
list |
可变 | 任意 | 通用有序集合 |
tuple |
不可变 | 任意 | 不可变的数据集合,字典键 |
array.array |
可变 | 单一数值类型 | 内存紧凑,数值运算轻量 |
numpy.ndarray |
可变 | 单一数值类型 | 科学计算,向量化操作 |
8. 总结
list是 Python 中最灵活、最常用的序列容器,适合存储有序且需要频繁修改的任意数据。- 掌握索引、切片、追加、插入、删除、排序等核心操作,以及列表推导式,可以高效处理绝大多数数据集合需求。
- 注意浅拷贝、可变默认参数等常见陷阱,根据场景选择合适的数据结构(如队列用
deque,数值数组用array或numpy)。
