2014-02-17 67 views
0

我想爲Conway's Game of Life編寫一個程序,並且我遇到了一些非常奇怪的問題,所以我要一步一步地試着去調試它。有一些奇怪的東西在繼續。函數在Python中改變參數的值

如果你不熟悉康威的生命遊戲,以確定下一階段的規則很簡單:

  • 少於兩隻活鄰居的活細胞死亡,彷彿引起 由根據人口。
  • 任何有兩個或三個活的鄰居的活細胞將繼續生活在下一代 一代。
  • 任何有超過三個活的鄰居的活細胞死亡,好像通過 過度擁擠。
  • 任何死細胞與三個活的鄰居成爲一個活細胞, 好像通過再生產。

我保持了一個名爲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功能康威邏輯發生什麼(我實在找不到爲什麼它不會工作)
  2. 我get_next功能是設置一個nextList變量,它不應該做任何事情squareList !!我在想什麼?

下面是我的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

你在get_next功能做的第一件事就是讓nextList相同的列表squareList點爲參考。賦值並不意味着複製 - nextList = squareList使兩個名稱都指向內存中的相同實際結構,因此對nextList的任何更改也會影響squareList

您應該使用copy.deepcopy獲取您squareList列表的實際拷貝。

+0

我認爲你不能改變python參數的值。 例如: 一個= 3 --- DEF總和(A,N):A = A + N ---總和(A,3)---->一個= 3,而不是= 6這是列表不是也適用於列表? – triplebig

+0

您沒有更改參數的_value_值 - 該值仍然是您傳遞給函數的列表。然而,_list_本身是_mutable_ - 您可以更改它的內容,並且無論您在何處引用同一個列表,都會看到這些更改。 – lanzz

+0

我想我明白了。但是,你的建議並不適合我。見上面的編輯。我想要的是複製另一個列表,並能夠編輯這些值而不更改最初的值。 – triplebig