Python用回溯法解数独时3D列表元素修改出现联动变更问题
问题根因
你遇到的赋值同步修改问题,本质是Python中列表为可变引用类型,你做的是直接引用赋值,没有生成独立的新棋盘对象:
- 代码中
grid[k + 1] = grid[k]是直接将grid[k]的内存地址赋值给grid[k+1],二者指向完全相同的二维列表,修改任意一个的单元格数值,另一个都会同步变化,根本不是你想要的“存储独立状态层”的效果。 - 就算你改用列表自带的
copy()方法或者切片[:]复制,也只是浅拷贝,只会复制外层的行列表,每一行内部的元素还是共享引用,修改单元格还是会出现同步改动的问题。
修复方案
- 首先引入深拷贝工具:在代码开头的import区域新增
import copy - 替换状态层复制的代码:将
grid[k + 1] = grid[k]修改为grid[k + 1] = copy.deepcopy(grid[k]),deepcopy会递归复制所有层级的列表,生成完全独立的新棋盘,修改新状态层不会影响旧的状态层。 - 额外修复逻辑bug:你当前的
sudo_rules函数只有返回False的分支,校验通过时会默认返回None,而None == False的判断结果为假,会导致合法的数值也被判定为不合法,需要在sudo_rules函数的最后一行添加return True。
其他优化建议
- 你初始化3D列表grid的方式可以简化,不需要提前写30个全0棋盘,每次回溯需要新状态层的时候直接深拷贝后append到grid中即可,避免空间浪费。
- 数独回溯不需要提前固定30层状态上限,极端情况空数独需要81层状态,你当前的30层上限可能会导致后续索引越界报错。
内容的提问来源于stack exchange,提问作者BMS13
相关产品推荐
相关产品推荐

