文章目录
- lst = [1, 2, 3] empty = [] ✅ 优点:简洁、高效、可读性强✅ 推荐:90% 场景首选
- lst = list([1, 2, 3]) # 从可迭代对象创建 empty = list() # 空列表 chars = list(“hello”) # [‘h’, ‘e’, ‘l’, ‘l’, ‘o’] ✅ 适用:将字符串、元组、集合等转为列表 注意:list() 比 [] 略慢(需函数调用开销)
- squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16] evens = [x for x in range(10) if x % 2 == 0] ✅ 优点:简洁、高效、Pythonic✅ 推荐:替代 for + append() 的首选
- zeros = [0] * 5 # [0, 0, 0, 0, 0] rows = [[0] * 3] * 2 # ❌ 危险!见下文陷阱 重大陷阱:[[0]*3]*2 会创建多个引用指向同一个子列表! matrix = [[0] * 3] * 2 matrix[0][0] = 1 print(matrix) # [[1, 0, 0], [1, 0, 0]] ← 意外修改了两行! ✅ 正确写法(用列表推导式): matrix = [[0] * 3 for _ in range(2)]
- import copy original = [1, [2, 3]] shallow = original.copy() # 浅拷贝 deep = copy.deepcopy(original) # 深拷贝 ✅ 用途:避免修改原列表(尤其含嵌套可变对象时)
- lst = [] for i in range(5): lst.append(i) ✅ 适用:无法预知元素数量的场景⚠️ 性能:比列表推导式慢,尽量避免
- lst = [1, 2, 3, 4] del lst[1] # 删除索引1 → [1, 3, 4] del lst[1:3] # 删除切片 → [1] del lst # 删除整个变量(不再指向列表) del lst 不是清空列表,而是解除变量名与对象的绑定。
- lst = [10, 20, 30] last = lst.pop() # 返回 30,lst → [10, 20] first = lst.pop(0) # 返回 10,lst → [20] ✅ 典型应用:实现栈(pop())或队列(pop(0),但效率低) pop(0) 时间复杂度 O(n),大数据量建议用 collections.deque
- lst = [1, 2, 2, 3] lst.remove(2) # 删除第一个2 → [1, 2, 3] lst.remove(99) # ValueError: list.remove(x): x not in list ✅ 建议:先判断 if value in lst 再删除,或捕获异常
- lst = [1, 2, 3] lst.clear() # lst → [] ✅ 优势:所有引用该列表的变量都会看到空列表 a = [1, 2, 3] b = a a.clear() print(b) # [] ← 因为 a 和 b 指向同一个对象
- # 错误! nums = [1, 2, 3, 4, 5] for x in nums: if x % 2 == 0: nums.remove(x) # 修改正在遍历的列表 → 跳过元素! # 结果:nums = [1, 3, 4, 5] ← 4 没被删! ✅ 正确做法: 遍历副本:for x in nums[:]: 或反向遍历:for i in range(len(nums)-1, -1, -1): 或使用列表推导式:nums = [x for x in nums if x % 2 != 0]
- a = [1, 2, 3] b = a del a # 只删除 a 这个名字,列表对象仍被 b 引用 print(b) # [1, 2, 3] ✅ 真正释放内存:当所有引用都被删除,Python 垃圾回收器才会回收对象。
- def reset_list_bad(lst): lst = [] # 只改变局部变量,不影响外部! def reset_list_good(lst): lst.clear() # 就地清空,外部可见 ✅ 如果需要让函数修改传入的列表,必须用 clear() 或切片赋值 lst[:] = []
目录
- 一、前言
- 二、列表的创建方式
- 1. 字面量语法(最常用)
- 2. 使用list()构造器
- 3. 列表推导式(List Comprehension)
- 4. 重复操作符*
- 5.copy()与deepcopy()(创建副本)
- 6. 动态创建(空列表 +append/extend)
- 三、列表的删除操作详解
- 1.del:按索引或切片删除
- 2.pop():删除并获取元素
- 3.remove():按值删除(只删第一个)
- 4.clear():清空列表(保留对象)
- 四、常见陷阱与避坑指南
- 陷阱 1:在遍历中直接删除元素(导致跳过)
- 陷阱 2:误以为del lst释放了内存
- 陷阱 3:混淆lst = []与lst.clear()
- 五、性能对比(小贴士)
- 六、最佳实践总结
- 七、结语
列表(list)是 Python 中最常用、最灵活的内置数据结构之一。
它支持动态扩容、混合类型、嵌套结构,几乎无处不在。
但你真的会“创建”和“删除”列表吗?
- 空列表有几种写法?哪种更快?
del、pop()、remove()有什么区别?- 删除元素后,内存真的释放了吗?
- 如何安全地清空一个被多个变量引用的列表?
本文将带你: ✅ 掌握 6 种列表创建方式及适用场景
✅ 深入理解 4 种删除操作的原理与差异
✅ 避开“删除后仍存在”的引用陷阱
✅ 学会高效清空与释放内存
✅ 写出安全、清晰、高性能的列表操作代码
lst = [1, 2, 3]
empty = []
✅ 优点:简洁、高效、可读性强
✅ 推荐:90% 场景首选
lst = list([1, 2, 3]) # 从可迭代对象创建
empty = list() # 空列表
chars = list("hello") # ['h', 'e', 'l', 'l', 'o']
✅ 适用:将字符串、元组、集合等转为列表
注意:list() 比 [] 略慢(需函数调用开销)
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]
evens = [x for x in range(10) if x % 2 == 0]
✅ 优点:简洁、高效、Pythonic
✅ 推荐:替代 for + append() 的首选
zeros = [0] * 5 # [0, 0, 0, 0, 0]
rows = [[0] * 3] * 2 # ❌ 危险!见下文陷阱
重大陷阱:[[0]*3]*2 会创建多个引用指向同一个子列表!
matrix = [[0] * 3] * 2
matrix[0][0] = 1
print(matrix) # [[1, 0, 0], [1, 0, 0]] ← 意外修改了两行!
✅ 正确写法(用列表推导式):
matrix = [[0] * 3 for _ in range(2)]
重大陷阱:[[0]*3]*2 会创建多个引用指向同一个子列表!
✅ 正确写法(用列表推导式):
import copy
original = [1, [2, 3]]
shallow = original.copy() # 浅拷贝
deep = copy.deepcopy(original) # 深拷贝
✅ 用途:避免修改原列表(尤其含嵌套可变对象时)
lst = []
for i in range(5):
lst.append(i)
✅ 适用:无法预知元素数量的场景
⚠️ 性能:比列表推导式慢,尽量避免
| 方法 | 作用 | 返回值 | 是否就地修改 |
|---|---|---|---|
del lst[index] |
按索引删除 | 无 | ✅ 是 |
lst.pop(index) |
按索引删除并返回值 | 被删元素 | ✅ 是 |
lst.remove(value) |
按值删除(首次匹配) | 无 | ✅ 是 |
lst.clear() |
清空所有元素 | 无 | ✅ 是 |
lst = [1, 2, 3, 4]
del lst[1] # 删除索引1 → [1, 3, 4]
del lst[1:3] # 删除切片 → [1]
del lst # 删除整个变量(不再指向列表)
del lst 不是清空列表,而是解除变量名与对象的绑定。
del lst 不是清空列表,而是解除变量名与对象的绑定。
lst = [10, 20, 30]
last = lst.pop() # 返回 30,lst → [10, 20]
first = lst.pop(0) # 返回 10,lst → [20]
✅ 典型应用:实现栈(pop())或队列(pop(0),但效率低)
pop(0) 时间复杂度 O(n),大数据量建议用 collections.deque
lst = [1, 2, 2, 3]
lst.remove(2) # 删除第一个2 → [1, 2, 3]
lst.remove(99) # ValueError: list.remove(x): x not in list
✅ 建议:先判断 if value in lst 再删除,或捕获异常
lst = [1, 2, 3]
lst.clear() # lst → []
✅ 优势:所有引用该列表的变量都会看到空列表
a = [1, 2, 3] b = a a.clear() print(b) # [] ← 因为 a 和 b 指向同一个对象
# 错误!
nums = [1, 2, 3, 4, 5]
for x in nums:
if x % 2 == 0:
nums.remove(x) # 修改正在遍历的列表 → 跳过元素!
# 结果:nums = [1, 3, 4, 5] ← 4 没被删!
✅ 正确做法:
- 遍历副本:
for x in nums[:]: - 或反向遍历:
for i in range(len(nums)-1, -1, -1): - 或使用列表推导式:
nums = [x for x in nums if x % 2 != 0]
a = [1, 2, 3]
b = a
del a # 只删除 a 这个名字,列表对象仍被 b 引用
print(b) # [1, 2, 3]
✅ 真正释放内存:当所有引用都被删除,Python 垃圾回收器才会回收对象。
def reset_list_bad(lst):
lst = [] # 只改变局部变量,不影响外部!
def reset_list_good(lst):
lst.clear() # 就地清空,外部可见
✅ 如果需要让函数修改传入的列表,必须用 clear() 或切片赋值 lst[:] = []
✅ 如果需要让函数修改传入的列表,必须用 clear() 或切片赋值 lst[:] = []
| 操作 | 时间复杂度 | 说明 |
|---|---|---|
append() |
O(1)(摊还) | 高效 |
pop()(末尾) |
O(1) | 高效 |
pop(0) / insert(0, x) |
O(n) | 低效,用 deque 替代 |
remove(x) |
O(n) | 需线性查找 |
x in lst |
O(n) | 大列表建议用 set |
clear() |
O(n) | 需释放每个元素的引用 |
| 场景 | 推荐做法 |
|---|---|
| 创建空列表 | lst = [] |
| 从可迭代对象创建 | list(iterable) |
| 条件过滤生成 | 列表推导式 [x for x in ... if ...] |
| 安全删除遍历中元素 | 遍历副本或用推导式 |
| 清空列表(多引用共享) | lst.clear() |
| 获取并删除末尾元素 | lst.pop() |
| 按值删除(确保存在) | 先 if x in lst 再 remove |
核心原则:
“就地修改” vs “创建新对象”要分清,
引用关系决定你的删除是否生效。
以上就是Python列表的创建与删除的操作指南的详细内容,更多关于Python列表创建与删除的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- Python实现在Word中创建,读取和删除列表详解
- Python列表创建、操作、删除与遍历的全方位解析
- Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
- Python编程之列表操作实例详解【创建、使用、更新、删除】