我想爲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功能是:
正如你所看到的,get_next函數觸及的所有內容都設置爲零。這不應該在我的腦海裏發生的原因有兩個:
- 這不應該按照我get_next功能康威邏輯發生什麼(我實在找不到爲什麼它不會工作)
- 我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建議:
我認爲你不能改變python參數的值。 例如: 一個= 3 --- DEF總和(A,N):A = A + N ---總和(A,3)---->一個= 3,而不是= 6這是列表不是也適用於列表? – triplebig
您沒有更改參數的_value_值 - 該值仍然是您傳遞給函數的列表。然而,_list_本身是_mutable_ - 您可以更改它的內容,並且無論您在何處引用同一個列表,都會看到這些更改。 – lanzz
我想我明白了。但是,你的建議並不適合我。見上面的編輯。我想要的是複製另一個列表,並能夠編輯這些值而不更改最初的值。 – triplebig