gpt4 book ai didi

Python不断更新数组

转载 作者:行者123 更新时间:2023-11-28 22:49:31 26 4
gpt4 key购买 nike

我用python写了一个简单的回溯算法来解数独,有一段时间有困难,因为好像更新了一个不应该更新的数组,导致整个程序备份。

本质上,作为代码的一部分,我存储了一个包含初始值的数组,然后复制了该数组,这样当我回溯和分配新值时,我没有更改任何给定的数字在原始数独中。然而,在这个过程中,我以某种方式更新了我的初始数字数组。我最终发现它是由行 grid=initial 引起的,它应该将我的工作网格 (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)

最佳答案

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

关于Python不断更新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23817305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com