在递归DFS函数中更新追踪矩阵时为何出现IndexError?
问题分析与修复
核心问题原因
你遇到的IndexError和多行意外更新的问题,根源完全在于**visited_matrix的初始化方式错误**:
- 代码
[[False] * 3] * 3并没有创建3个独立的子列表,而是生成了1个[False, False, False]列表,然后将这个列表的引用重复添加3次到外层列表中。 - 这意味着:当你执行
visited[row][col] = True时,所有行的第col列都会被同步修改——因为它们指向同一个底层列表。 - 虽然你的边界检查逻辑本身正确,但这种错误的引用结构会破坏DFS的访问标记逻辑,导致递归过程中出现意外的越界访问(比如某些本应被拦截的无效索引未被正确处理),最终触发
IndexError。
修复方案
需要创建3个独立的子列表来初始化visited_matrix,以下是两种可靠的方式:
方式1:列表推导式(推荐)
visited_matrix = [[False for _ in range(3)] for _ in range(3)]
方式2:逐行手动创建
visited_matrix = [] for _ in range(3): visited_matrix.append([False] * 3)
两种方式都会确保每个子列表是独立的对象,修改某一行的元素不会影响其他行。
验证修复效果
修改初始化代码后,运行你的DFS函数,会正常输出:
Visited: 0, 0 Visited: 0, 1 Visited: 0, 2
不再出现索引错误,也不会有多行被意外更新的异常行为。
通用优化建议
为了让代码适配任意尺寸的网格,不要硬编码3x3的尺寸,而是根据输入矩阵动态生成visited_matrix:
# 基于输入矩阵的行列数动态初始化 visited_matrix = [[False] * len(sample_matrix[0]) for _ in range(len(sample_matrix))]
内容的提问来源于stack exchange,提问作者15 詹詠翔
相关产品推荐
相关产品推荐

