Python与JavaScript实现数独求解器for循环运行结果不一致问题求助
问题原因
你遇到的是Python列表初始化的经典坑:rows=[{}]*n、cols=[{}]*n、boxes=[{}]*n这种写法,并不会创建n个独立的空字典,而是生成了n个指向同一个字典对象的引用。修改任意下标的字典内容,本质都是修改同一个字典,所以最后所有位置的字典内容完全一致,存了所有出现过的数字。
对比你的JS代码,JS是循环单独给每个下标赋值{},每个都是独立的对象,所以运行正常。
修复方案
把三个列表的初始化改为用列表推导式生成独立字典即可,修改后的Python代码如下:
import math def get_box_id(r,c): row=int(math.floor(r/3)*3) col=int(math.floor(c/3)) return row+col def solve_sudoku(board): n=len(board) # 用列表推导式生成n个独立的空字典 rows = [{} for _ in range(n)] cols = [{} for _ in range(n)] boxes = [{} for _ in range(n)] for r in range(n): for c in range(n): if board[r][c]!='.': box_id=get_box_id(r,c) val=board[r][c] boxes[box_id][val]=True rows[r][val]=True cols[c][val]=True print(rows) board = [ ["5", "3", ".", ".", "7", ".", ".", ".", "."], ["6", ".", ".", "1", "9", "5", ".", ".", "."], [".", "9", "8", ".", ".", ".", ".", "6", "."], ["8", ".", ".", ".", "6", ".", ".", ".", "3"], ["4", ".", ".", "8", ".", "3", ".", ".", "1"], ["7", ".", ".", ".", "2", ".", ".", ".", "6"], [".", "6", ".", ".", ".", ".", "2", "8", "."], [".", ".", ".", "4", "1", "9", ".", ".", "5"], [".", ".", ".", ".", "8", ".", ".", "7", "9"], ] solve_sudoku(board)
运行修改后的代码,输出的rows结果就会和JS版本完全一致。
内容的提问来源于stack exchange,提问作者Yilmaz
相关产品推荐
相关产品推荐

