Python数独求解器change_value方法异常问题排查求助
数独求解器change_value方法误删可能性值的原因分析
核心原因:列表引用复用导致同步修改
你执行后possibility_arrays[6][4]和possibility_arrays[6][5]的6都被移除,最直接的原因是这两个位置的可能性数组指向了同一个列表对象。
比如你填充possibility_arrays时可能写了类似这样的代码:
temp = [2, 6] possibility_arrays[6][4] = temp possibility_arrays[6][5] = temp
而不是为每个单元格创建独立的列表:
possibility_arrays[6][4] = [2, 6] possibility_arrays[6][5] = [2, 6]
在Python中,列表是可变对象,赋值操作只会传递引用。当你调用possibility_arrays[6][5].remove(6)时,实际上修改的是底层的同一个列表,因此possibility_arrays[6][4]的内容也会同步变化,看起来像是被误删,本质是引用共享导致的。
次要问题:possibility_arrays的索引逻辑颠倒
你的初始化代码导致possibility_arrays的行和列索引完全颠倒,这会引发更多逻辑混乱:
possibility_arrays = [] for _ in range(9): possibility_arrays.append([]) for s in range(9): # s是行号 for x in range(9): # x是列号 possibility_arrays[x].append([]) # 将行s的元素添加到列x的列表中
这段代码创建的possibility_arrays结构是possibility_arrays[列号][行号],但你在所有业务代码中都用possibility_arrays[行号][列号]访问,这会导致你实际操作的单元格和预期完全不符:
- 想处理第5行的所有列,实际操作的是第5列的所有行
- 想处理第5列的所有行,实际操作的是第5行的所有列
虽然这次误删的直接原因是引用复用,但索引颠倒会导致后续更多难以排查的逻辑错误,必须修正。
修正方案
- 修复索引逻辑:将
possibility_arrays的初始化改为行优先结构,确保possibility_arrays[行号][列号]正确对应目标单元格:
possibility_arrays = [[[] for _ in range(9)] for _ in range(9)]
- 避免列表引用复用:为每个单元格的可能性数组创建独立的列表对象,不要直接复用同一个列表的引用。
内容的提问来源于stack exchange,提问作者flo
相关产品推荐
相关产品推荐

