本文主要是介绍Python列表的创建与删除的操作指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍...
一、前言
列表(list)是 python 中最常用、最灵活的内置数据结构之一。
它支持动态扩容、混合类型、嵌套js结构,几乎无处不在。
但你真的会“创建”和“删除”列表吗?
- 空列表有几种写法?哪种更快?
del、pop()、remove()有什么区别?- 删除元素后,内存真的释放了吗?
- 如何安全地清空一个被多个变量引用的列表?
本文将带你: ✅ 掌握 6 种列表创建方式及适用场景
✅ 深入理解 4 种删除操作的原理与差异
✅ 避开“删除后仍存在”的引用陷阱
✅ 学会高效清空与释放内存
✅ 写出安全、清晰、高性能的列表操作代码
二、列表的创建方式
1. 字面量语法(最常用)
lst = [1, 2, 3] empty = []
✅ 优点:简洁、高效、可读性强
✅ 推荐:90% 场景首选
2. 使用list()构造器
lst = list([1, 2, 3]) # 从可迭代对象创建
empty = list() # 空列表
chars = list("hello") # ['h', 'e', 'l', 'l', 'o']✅ 适用:将字符串、元组、集合等转为列表
注意:list() 比 [] 略慢(需函数调用开销)
3. 列表推导式(List Comprehension)
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() 的首选
4. 重复操作符*
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)]
5.copy()与deepcopy()(创建副本)
import copy original = [1, [2, 3]] shallow = original.copy() # 浅拷贝 deep = copy.deepcopy(original) # 深拷贝
✅ 用途:避免修改原列表(尤其含嵌套可变对象时)
6. 动态创建(空列表 +append/extend)
lst = []
for i in range(5):
lst.append(i)✅ 适用:无法预知元素数量的场景
⚠️ 性能:比列表推导式慢,尽量避免
三、列表的删除操作详解
| 方法 | 作用 | 返回值 | 是否就地修改 |
|---|---|---|---|
del lst[index] | 按索引删除 | 无 | ✅ 是 |
lst.pop(index) | 按索引删除并返回值 | 被删元素 | ✅ 是 |
lst.remove(value) | 按值删除(首次匹配) | 无 | ✅ 是 |
lst.clear() | 清空所有元素 | 无 | ✅ 是 |
1.del:按索引或切片删除
lst = [1, 2, 3, 4] del lst[1] # 删除索引1 → [1, 3, 4] del lst[1:3] # 删除切片 → [1] del lst # 删除整个变量(不再指向列表)
del lst 不是清空列表,而是解除变量名与对象的绑定。
2.pop():删除并获取元素
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
3.remove():按值删除(只删第一个)
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 再删除,或捕获异常
4.clear():清空列表(保留对象)
lst = [1, 2, 3] lst.clear() # lst → []
✅ 优势:所有引用该列表的变量都会看到空列表
a = [1, 2, 3] b = a a.clear() print(b) # [] ← 因为 a 和 b 指向同一个对象
四、常见陷阱与避坑指南
陷阱 1:在遍历中直接删除元素(导致跳过)
# 错误!
nums = [1, 2, 3, 4, 5]
for x in nums:
if x % 2 == 0:
numshttp://www.chinasem.cn.remove(x) # 修改正在遍历的列表 → 跳过元素!
# 结果:nums = [1, 3, 4, 5] ← 4 没被删!✅ 正确做法:
- 遍历副本:
for x in nums[:]: - 或反向遍历:
f编程or i in range(len(nums)-1, -1, -1): - 或使用列表推导式:
nums = [x for x in nums if x % 2 != 0]
陷阱 2:误以为del lst释放了内存
a = [1, 2, 3] b = a del a # 只删除 a 这个名字,列表对象仍被 b 引用 print(b) # [1, 2, 3]
✅ 真正释放内存:当所有引用都被删除,Python 垃圾回收器才会回收对象。
陷阱 3:混淆lst = []与lst.clear()
def reset_list_bad(lst):
lst = [] # 只改变局部变量,不影响外部!
def reset_list_good(lst):
lst.clear() # 就地清空,外部可见✅ 如果需要让函数修改传入的列表,必须用 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 ...] |
| 安全删除遍历中元素 | 遍历副本或用推导式 |
| 清空列表android(多引用共享) | lst.clear() |
| 获取并删除末尾元素 | lst.pop() |
| 按值删除(确保存在) | 先 if x in lst 再 remove |
核心原则:
“就地修改” vs “创建新对象”要分清,
引用关系决定你的删除是否生效。
七、结语
以上就是Python列表的创建与删除的操作指南的详细内容,更多关于Python列表创建与删除的资料请关注China编程(www.chinasem.cn)其它相关文章!
这篇关于Python列表的创建与删除的操作指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!