
本文详解归并排序中常见的 IndexError: list assignment index out of range 错误根源,指出因向空列表直接赋值 b[k] 导致的崩溃,并提供安全、可运行的修复方案,包含原地排序、辅助列表管理与结果回写等关键实践。
本文详解归并排序中常见的 `indexerror: list assignment index out of range` 错误根源,指出因向空列表直接赋值 `b[k]` 导致的崩溃,并提供安全、可运行的修复方案,包含原地排序、辅助列表管理与结果回写等关键实践。
归并排序是一种经典的分治(Divide-and-Conquer)排序算法,其核心逻辑分为三步:分解(递归切分)→ 排序(递归处理子数组)→ 合并(将两个有序子数组归并为一个)。然而,在 Python 中实现时,一个极易被忽视的陷阱是:在 merge 函数中,若将空列表 [] 作为临时缓冲区 b 传入,并尝试通过索引赋值(如 b[k] = value),会立即触发 IndexError——因为空列表没有下标 0,更不存在 k ≥ 0 的有效位置。
根本原因在于:Python 列表的索引赋值(b[k] = x)要求目标索引 k 已存在;而 append() 才是动态扩展列表的正确方式。原始代码中:
s = merge(a, lower, middle, upper, []) # b 是空列表 # ... 在 merge 内部执行 b[k] = a[i] → IndexError!
此处 b 长度为 0,但循环中 k 从 lower(如 0)开始递增,b[0] 无法写入。
✅ 正确做法是:在 merge 中统一使用 b.append() 构建有序临时列表,并在 mergesort 中将结果切片回写到原数组对应区间,确保排序效果落地:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
def merge(a, lower, middle, upper, b):
i, j = lower, middle + 1
while i <p>⚠️ 注意事项:</p>
-
不要忽略返回值:原始代码中
s = merge(...)后未使用s,导致排序结果丢失; -
边界需严格一致:
a[lower:upper+1]的切片长度必须等于temp长度(即upper - lower + 1),否则引发静默错误或数据截断; -
避免全局/隐式状态:
mergesort应明确接收并修改传入的列表对象,调用前需持有该列表引用(如arr = [...]); - 进阶优化:若追求空间效率,可预分配固定长度的辅助数组
b = [0] * len(a)并配合索引操作,但需确保b容量充足且索引不越界。
通过以上修正,代码既消除了索引越界风险,又保证了排序逻辑的完整性与可验证性,是 Python 归并排序教学与工程实践中的健壮范式。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










