我正在尝试为Conway's Game of Life编写程序,我遇到了一些非常奇怪的问题,所以我会一步一步地尝试调试它。有一些奇怪的事情正在发生。
如果您不熟悉康威的生命游戏,那么确定下一阶段的规则就是:
我保留一个名为 squareList 的列表,其中包含N_ROWS行和N_COL列。我将每个元素引用为 squareList [i] [j] 。
我的 get_next(squareList)函数返回另一个列表,该列表计算每个方块中“邻居”的数量,并返回下一个阶段的另一个列表。
现在,我的问题。这是一个测试用例,突出显示函数正在改变它不应该的值:
squareList = init_list(NUM_ROWS, NUM_COL) #sets all values in squareList to zero.
#here, NUM_ROWS = 12 and NUM_COL = 18
squareList[11][17] = 1
squareList[5][7] = 1
squareList[6][7] = 1
squareList[7][7] = 1
squareList[9][2] = 1
squareList[9][3] = 1
squareList[9][4] = 1
print_list(squareList) #prints squareList
nextList = get_next(squareList) #does NOT change squareList
print '\n--------------------------------------\n'
print_list(squareList) #prints squareList again
sys.exit()
使用print_list函数时得到的是:
如您所见,get_next函数触及的所有内容都设置为零。这不应该在我的脑海中发生,原因有两个:
这是我的get_next函数的代码:
def get_next(squareList): #gets the next list for the game of life
nextList = squareList
for i in range(1,NUM_ROWS - 1):
for j in range(1,NUM_COL-1):
#num of neighbors:
counter = sum( [squareList[i+x][j+y] for x in range(-1,2) for y in range(-1,2) if not (x==y and x == 0)])
#logic for changing:
if squareList[i][j] == 1 and counter < 2: nextList[i][j] = 0
elif squareList[i][j] == 1 and counter > 3: nextList[i][j] = 0
elif squareList[i][j] == 0 and counter == 3: nextList[i][j] = 1
return nextList
我最初的想法是它正在改变一个全局变量,但事实并非如此。首先,python需要声明它在函数中使用的全局变量,其次,我尝试更改列表的名称,并得到相同的结果。
编辑:回复lanzz建议:
答案 0 :(得分:1)
您在get_next
函数中首先要做的是nextList
对squareList
指向的同一列表的引用。分配并不意味着复制 - nextList = squareList
使两个名称指向内存中的相同实际结构,因此对nextList
的任何更改也会影响squareList
。
您应该使用copy.deepcopy
获取squareList
列表的实际副本。