You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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行的所有列

虽然这次误删的直接原因是引用复用,但索引颠倒会导致后续更多难以排查的逻辑错误,必须修正。

修正方案

  1. 修复索引逻辑:将possibility_arrays的初始化改为行优先结构,确保possibility_arrays[行号][列号]正确对应目标单元格:
possibility_arrays = [[[] for _ in range(9)] for _ in range(9)]
  1. 避免列表引用复用:为每个单元格的可能性数组创建独立的列表对象,不要直接复用同一个列表的引用。

内容的提问来源于stack exchange,提问作者flo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:15:54