2011-03-22 66 views
2

我正在寫一個需要2d數組的程序,並且遇到了一個奇怪的問題。這兩個二維數組有什麼區別?

起初,我寫道:

board = [[]]*11 

在一個陣列中做11個陣列。

然後我想11個坯料的每個陣列內,所以我寫道:

for i in range(11): 
    board[i].append(' ') 

我想填充第三陣列,從索引4至7分,所以我寫:

for i in range(4, 7): 
    board[2][i] = '*' 

但後來出乎意料的是,並非只有第三個陣列受到代碼的影響,「板子」中的所有陣列都發生了變化。

所以當然,我這樣寫道:

board2 = [] 
for i in range(11): 
    board2.append([]) 

創建我的數組,然後寫道:

for i in range(11): 
    for i in range(11): 
     board2[i].append(' ') 

創建我的數組包含11個空格11個陣列。

在我創建了這樣的數組後,我能夠運行代碼來添加恆星,並且如預期的那樣,隻影響了一個數組而不是所有恆星。

請問有誰能解釋兩個看起來相似的數組有什麼區別?

回答

7

該列表[[]] * 11包含11個引用相同列表

第二個示例創建11 不同的列表。

board = [[]]*11 
#  ^^ this is called just once 

board2 = [] 
for i in range(11): 
    board2.append([]) 
#     ^^ this is called 11 times, creating 11 different lists 

另一種方式來寫第二個例子是使用列表理解:

[[] for i in range(11)] 
+0

謝謝你給我看一個較短的方式! – John 2011-03-22 21:05:57