2017-08-07 74 views
0

我的程序需要檢查二維數組中的每個元素,並使用舊數組的countNeigh(x,y)填充一個新數組[countNeigh返回舊數組中的活着的鄰居動物陣列]二維列表的分配聲明

我初始化新陣列作爲電流/舊數組的副本,並使用兩個for循環來檢查每個單獨的元件,以及填充該新的數組:

newAnimalArr = isAnimalArr 
for x in range(len(isAnimalArr)): 
    for y in range(len(isAnimalArr[x])): 
     newAnimalArr[x][y] = countNeigh(x,y) 

上述代碼填充newAnimalArr值不正確。我98%確定這不是countNeigh(x,y)函數中的錯誤,因爲稍微改變代碼(如下所示)時,newAnimalArr具有正確的值。

newAnimalArr = [] 

for x in range(len(isAnimalArr)): 
    rowArr = [] 
    for y in range(len(isAnimalArr[x])): 
     rowArr.append(countNeigh(x,y)) 
    newAnimalArr.append(rowArr) 

-第一部分代碼的問題是什麼?數組的初始化?或每個元素的賦值語句?

我之前已經讀過,初始化一個二維數組q = [[None]*5]*4是一個被多次引用的數組(這會導致通過單個數組的所有重複來分配單個元素);即使類似的問題發生在我的數組中,那麼也應該存在與賦值語句newAnimalArr[x][y] = countNeigh(x,y)有關的問題,因爲初始化只是爲了複製當前/舊數組的維度而已。

回答

0

我會對此事進行對衝countNeigh參考原始isAnimalArr進行計算。我對嗎?因爲,那會解釋你錯誤的答案。爲什麼?因爲該行的:

newAnimalArr = isAnimalArr 

你讓一個參考副本,不是實際拷貝。這意味着newAnimalArrisAnimalArr是指相同的陣列。因此,對newAnimalArr所做的任何修改都會影響原始內容。例如:

In [1028]: x = [[1, 2, 3], [4, 5, 6]] 

分配xy,因爲你做了。

In [1029]: y = x 

比較ids,它們是一樣的。

In [1032]: id(x) == id(y) 
Out[1032]: True 

修改y

In [1033]: y[0][1] = 234567 

的變化是x見過太多。

In [1034]: x 
Out[1034]: [[1, 234567, 3], [4, 5, 6]] 

如果你想避免這種情況,你需要做一個副本。

import copy 
newAnimalArr = copy.copy(isAnimalArr) 

現在,newAnimalArr所做的更改對isAnimalArr沒有影響,所以應countNeigh相對於isAnimalArr未在任何時間點修改返回正確的價值觀。