无法在Python的嵌套函数中保存全局数组中变量的当前状态(非常混乱的标题,请阅读描述)



我编写了这个python程序来解决数独,并将其所有可能的有效答案保存在一个数组中并返回它。但它没有做到这一点。逻辑是完美的,并且正在完美地执行。但问题是,在这两个嵌套的else求解函数,我想保存在allAns数组板的当前情况,但我不能这样做。每次我尝试时,它都会在allAns数组中保存默认值(带有点的值)。我尝试使用非局部变量,在allAns数组作为参数传递和更多,但我无法这样做。在网上找不到任何帮助。这地方是我最后的希望

def solveSudoku(board: list[list[str]]) -> None:
allAns = []
board1 = board.copy()
def totalEle(i: int, j: int, allEle: list[int]):
for b in range(9):
if board[i][b] != '.':
allEle[int(board[i][b]) - 1] = False
if board[b][j] != '.':
allEle[int(board[b][j]) - 1] = False
boxI = (i // 3) * 3 + b // 3
boxJ = (j // 3) * 3 + b % 3
if board[boxI][boxJ] != '.':
allEle[int(board[boxI][boxJ]) - 1] = False
def solver(i: int, j: int):
if board[i][j] == '.':
cannotBe = [True for _ in range(9)]
totalEle(i, j, cannotBe)
for k in range(1, 10):
if cannotBe[k-1]:
board[i][j] = str(k)
if j < 8:
solver(i, j + 1)
elif i < 8:
solver(i + 1, 0)
else:
for m in range(9):
for n in range(9):
board1[m][n] = board[m][n]
allAns.append(board1)
board[i][j] = '.'
else:
if j < 8:
solver(i, j + 1)
elif i < 8:
solver(i + 1, 0)
else:
for m in range(9):
for n in range(9):
board1[m][n] = board[m][n]
allAns.append(board1)
solver(0, 0)
print(allAns)
return allAns
sudoku =   [["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"]]
allAnswers = solveSudoku(sudoku)

这个问题是由于递归函数的作用域。您可以使用deepcopy()

from copy import deepcopy
def solveSudoku(board: list[list[str]]) -> None:
allAns = []
board1 = deepcopy(board)
# etc...

更多信息请看答案

最新更新