Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法创建实例变量(Python)的副本_Python_Backtracking - Fatal编程技术网

无法创建实例变量(Python)的副本

无法创建实例变量(Python)的副本,python,backtracking,Python,Backtracking,我用python创建了一个数独类,我想解决板的问题,并在原始板上保留一个实例变量,但是当我使用使用递归回溯算法self.board的solve()方法时,会随着self.solved\u board一起改变,这是为什么呢,我怎样才能在原始副本中保留一个变量 grid = [ [3, 0, 6, 5, 0, 8, 4, 0, 0], [5, 2, 0, 0, 0, 0, 0, 0, 0], [0, 8, 7, 0, 0, 0, 0, 3, 1], [0, 0,

我用python创建了一个数独类,我想解决板的问题,并在原始板上保留一个实例变量,但是当我使用使用递归回溯算法
self.board
solve()
方法时,会随着
self.solved\u board
一起改变,这是为什么呢,我怎样才能在原始副本中保留一个变量

grid = [ [3, 0, 6, 5, 0, 8, 4, 0, 0], 
     [5, 2, 0, 0, 0, 0, 0, 0, 0], 
     [0, 8, 7, 0, 0, 0, 0, 3, 1], 
     [0, 0, 3, 0, 1, 0, 0, 8, 0], 
     [9, 0, 0, 8, 6, 3, 0, 0, 5], 
     [0, 5, 0, 0, 9, 0, 6, 0, 0], 
     [1, 3, 0, 0, 0, 0, 2, 5, 0], 
     [0, 0, 0, 0, 0, 0, 0, 7, 4], 
     [0, 0, 5, 2, 0, 6, 3, 0, 0] ]

class Sudoku:
    def __init__(self, board):
        self.board = board
        self.solved_board = board[:] #<--- I used the [:] because I thought this will create a new list

def get_board(self):
    return self.board

def set_board(self, board):
    self.board = board
    self.solved_board = board

def print_original_board(self):
    self.print(self.board)

def print_solved_board(self):
    self.print(self.solved_board)

def print(self, board):
    """Receiving a matrix and printing a board with seperation"""
    for i in range(len(board)):
        if i % 3 == 0 and i!=0:
            print('---------------------------------')
        
        for j in range(len(board[i])):
            if j%3==0 and j!=0:
                print(" | ", end='')
            print(" " + str(board[i][j]) + " ", end='')
        
        print('')


def find_empty(self,board):
    """Receiving a matrix, loops through it, and return a tuple 
    with the row and the column of the free stop in the matrix"""
    
    for i in range(len(board)):
        for j in range(len(board[i])):
            if board[i][j]==0:
                return (i,j)
    return None


def is_valid(self, board, num, pos):
    """Receiving matrix, a number we want to insert, and a tuple with the row and col
    and will check if the row, col, and box are valid so we can place the number 
    in the position"""

    # Check row
    for i in range(len(board[pos[0]])):
        if pos[0] != i and board[pos[0]][i] == num:
            return False
        
    # Check col
    for i in range(len(board)):
        if pos[1] != i and board[i][pos[1]] == num:
            return False

    pos_row = pos[0] // 3  
    pos_col = pos[1] // 3   
    
    for i in range(pos_row*3  ,pos_row*3 + 3):
        for j in range(pos_col * 3, pos_col*3 + 3):
            if (i,j) != pos and board[i][j] == num:
                return False
    
    return True


def solve(self):
    """Using backtracking algorithm to solve the solved_board variable"""
    find = self.find_empty(self.solved_board)

    if not find:
        return True
    else:
        row, col = find 
    
    for i in range(1,10):
        if(self.is_valid(self.solved_board, i, (row, col))):
            self.solved_board[row][col] = i

            if self.solve():
                return self.solved_board
        
        self.solved_board[row][col] = 0
        
    return False


sudoku = Sudoku(grid)
sudoku.print_original_board()
print(" ")
sudoku.solve()
sudoku.print_original_board() # <---- This prints the solved board
grid=[[3,0,6,5,0,8,4,0,0],
[5, 2, 0, 0, 0, 0, 0, 0, 0], 
[0, 8, 7, 0, 0, 0, 0, 3, 1], 
[0, 0, 3, 0, 1, 0, 0, 8, 0], 
[9, 0, 0, 8, 6, 3, 0, 0, 5], 
[0, 5, 0, 0, 9, 0, 6, 0, 0], 
[1, 3, 0, 0, 0, 0, 2, 5, 0], 
[0, 0, 0, 0, 0, 0, 0, 7, 4], 
[0, 0, 5, 2, 0, 6, 3, 0, 0] ]
类数独游戏:
def ___;初始(自我,板):
self.board=board

self.solved_board=board[:]#是的,
board[:]
确实创建了一个新的列表——所有这些旧的内部列表:

[23]中的
board=[1]、[2]]
在[24]中:board2=板[:]
在[25]中:board2[0]是board[0]
Out[25]:对
[26]中:board2[0][0]+=10
在[28]中:板
出[28]:[11],[2]]
你需要复制它;e、 g

solved_board=[row[:]代表board中的行]

self.solved_board=board[:]
确实创建了一个新列表,但它引用了与
board
相同的内部列表。你需要更深一层:

self.solved_board = [row[:] for row in board]
尝试deepcopy方法

 from copy import deepcopy
    def __init__(self, board):
       self.board = board
       self.solved_board = deepcopy(board)
你需要做一份深度拷贝,那是一个列表列表。