当前位置: 代码网 > it编程>前端脚本>Python > Python列表的创建与删除的操作指南

Python列表的创建与删除的操作指南

2025年12月08日 Python 我要评论
一、前言列表(list)是 python 中最常用、最灵活的内置数据结构之一。它支持动态扩容、混合类型、嵌套结构,几乎无处不在。但你真的会“创建”和“删除&rdqu

一、前言

列表(list)是 python 中最常用、最灵活的内置数据结构之一。
它支持动态扩容、混合类型、嵌套结构,几乎无处不在。

但你真的会“创建”和“删除”列表吗?

  • 空列表有几种写法?哪种更快?
  • delpop()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:
        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]

陷阱 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 lsto(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列表创建与删除的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com