Python列表掌握关键在于理解内存行为、操作边界和误用场景:append()原地O(1)优于+拼接的O(n);pop(0)为O(n),高频删头应选deque;切片赋值是“删+插”组合;列表推导式中if过滤与if-else选择语法位置不同。

标题里的“第522讲”是干扰项,Python 列表没有编号课程体系,也没有所谓“官方系统学习路线”。列表是基础数据结构,掌握它不靠追讲数,而在于理解内存行为、操作边界和常见误用场景。
为什么 list.append() 比 list = list + [x] 快得多?
因为 append() 是原地修改,时间复杂度 O(1);而 + 每次都新建列表对象,需复制全部元素,时间复杂度 O(n)。循环中用后者会导致平方级耗时。
- 错误写法:
result = [] for x in data: result = result + [x] # 每轮都复制整个 result - 正确写法:
result = [] for x in data: result.append(x) # 原地追加,均摊 O(1) - 注意:
append()只加一个元素;要加多个用extend(),不是append([a,b])(那会嵌套成列表)
list.pop() 默认弹出末尾,但指定索引时性能断崖下跌
Python 列表底层是动态数组,pop() 不带参数时直接删末尾,O(1);但 pop(0) 或 pop(k) 需要把索引 k 后所有元素前移,最坏 O(n)。
- 高频删开头?改用
collections.deque,popleft()是 O(1) - 需要随机访问 + 频繁中间删插?考虑是否真该用列表——也许
dict或二分查找 +bisect更合适 -
del my_list[0]和my_list.pop(0)性能表现一致,都是 O(n)
切片赋值不是替换,而是“删除+插入”的组合动作
my_list[1:3] = [99, 88] 看似简单,实际先删掉索引 1~2 的元素(含头不含尾),再把右侧列表逐个插入原位置。长度可变,且右侧可以是任意可迭代对象。
立即学习“Python免费学习笔记(深入)”;
- 清空中间段:
my_list[2:5] = []→ 等价于del my_list[2:5] - 插入不删除:
my_list[3:3] = ['x', 'y']→ 在索引 3 处插入(空切片) - 右侧为生成器也合法:
my_list[0:0] = range(3),但会立即展开消耗内存 - 别写
my_list[:] = some_generator来“清空并填充”,若生成器耗时长或失败,列表已空无法回退
列表推导式里用 if 和用 if-else 语法位置完全不同
过滤用 [x for x in seq if condition];条件选择用 [a if cond else b for x in seq]。混用或错位会报 SyntaxError 或逻辑错误。
- 想筛出偶数:
[x for x in nums if x % 2 == 0]✔️ - 想把偶数变 0、奇数变 1:
[0 if x % 2 == 0 else 1 for x in nums]✔️ - 错误写法:
[x if x % 2 == 0 for x in nums]→ 缺少else,SyntaxError - 更隐蔽的坑:
[x for x in nums if x > 0 else 0]→ 语法非法,if过滤不能跟else
真正卡住人的从来不是“会不会写列表”,而是当程序变慢、内存暴涨、结果错位时,能否立刻意识到:是不是在循环里拼接列表?是不是在头部反复 pop(0)?是不是切片赋值误删了数据?这些点不靠听课次数,靠每次报错后翻一眼 id(my_list) 和 sys.getsizeof()。










