【问题标题】:Python continuously updating arrayPython不断更新数组
【发布时间】:2014-05-22 21:24:38
【问题描述】:

我在python中写了一个简单的回溯算法来解决数独的问题,有一段时间遇到了困难,因为它似乎更新了一个不应该更新的数组,导致整个程序备份。

基本上,作为代码的一部分,我存储了一个包含初始值的数组,然后制作了该数组的副本,这样当我回溯并分配新值时,我不会更改给定的任何数字在原始数独中。然而,在这个过程中,我以某种方式更新了我的初始数字数组。我最终发现它是由grid=initial 行引起的,它应该将我的工作网格(网格)设置为初始值(初始值),但只在程序开始时被调用。当我取出那条线并手动将网格分配给与初始相同的东西(通过复制/粘贴)时,程序运行良好。

我在下面包含了我的完整代码,有人知道为什么该行可能会再次被调用吗?我想不通。

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

#The following line used to be grid=initial

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


def printBoard(grid):
    for i in range(0,8):
        print(grid[i])

def checkValidity(num,row,col):
    if num in grid[row]:
        return False


    for i in range(0,8):
        if grid[i][col]==num:
            return False


    cageRow=row//3
    cageCol=col//3
    for i in range(0,3):
        if num in grid[3*cageRow+i][3*cageCol:3*cageCol+3]:
            return False


    return True

def nextCell(row,col,backtrack):
    if backtrack==0:
        if col==8:
            row+=1
            col=0
        else:
            col+=1
    else:
        if col==0:
            row-=1
            col=8
        else:
            col-=1
    if row<0:
        print("Error: Backtracked too far.")
    return (row,col)

def findNewNumber(row,col,num,backtrack):
    for i in range(num+1,10):
        if checkValidity(i,row,col):
            return (i,0)
    return (0,1)


row=0
col=0
backtrack=0
print("Solving...")

while row<9:
    if grid[row][col]==initial[row][col] and initial[row][col]!=0:
        [row,col]=nextCell(row,col,backtrack)
    else:
        num=grid[row][col]
        grid[row][col]=99
        [num,backtrack]=findNewNumber(row,col,num,backtrack)
        grid[row][col]=num
        [row,col]=nextCell(row,col,backtrack)

print("Solved!")
printBoard(initial)
print("")
printBoard(grid)

【问题讨论】:

    标签: python arrays


    【解决方案1】:
    grid = initial
    id(initial) == id(grid)
    >>> True
    

    这不会将grid 设置为与initial 相同的值。它使grid 引用与initial 相同的对象。人们通常做的就是做一个浅拷贝,像这样

    grid = initial[:]
    id(initial) == id(grid)
    >>> False
    

    不过,这不适用于您的情况。它将创建一个新的外部列表,其中包含相同的内部列表。

    id(initial[0]) == id(grid[0])
    >>> True
    

    您还需要一个deepcopy 来获取内部列表的副本。

    import copy
    
    grid = copy.deepcopy(initial)
    

    然后一切都被复制

    id(initial) == id(grid)
    >>> False
    id(initial[0]) == id(grid[0])
    >>> False
    

    【讨论】:

    • 谢谢!在javascript中复制数组是否有类似的方法?我目前正在学习JS,并在python中构建了这个,看看问题是算法本身还是我的实现。
    猜你喜欢
    • 2018-06-21
    • 2015-01-12
    • 2012-05-09
    • 2021-08-30
    • 2016-03-20
    • 2019-03-24
    • 2019-04-26
    • 1970-01-01
    • 2015-03-21
    相关资源
    最近更新 更多