函数在Python中更改参数的值

时间:2014-02-17 22:28:51

标签: python debugging pygame

我正在尝试为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函数时得到的是:

enter image description here

如您所见,get_next函数触及的所有内容都设置为零。这不应该在我的脑海中发生,原因有两个:

  1. 根据我的get_next函数中的Conway逻辑,这不是应该发生的事情(我真的找不到它为什么不起作用)
  2. 我的get_next函数正在设置 nextList 变量,它不应该对 squareList 做任何事情!! 我错过了什么?< / LI>

    这是我的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建议:

    enter image description here

1 个答案:

答案 0 :(得分:1)

您在get_next函数中首先要做的是nextListsquareList指向的同一列表的引用。分配并不意味着复制 - nextList = squareList使两个名称指向内存中的相同实际结构,因此对nextList的任何更改也会影响squareList

您应该使用copy.deepcopy获取squareList列表的实际副本。