2017-02-13 57 views
1

當我更改嵌套列表grid中的值時,我發現了一個奇怪的行爲,它被初始化爲grid = [[0]*10]*10更改嵌套列表中的單個值時,多個值會發生變化

grid = [[0]*10]*10 

grid[0][0] = 1 

for l in grid: 
    print l 

輸出:

[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

當我初始化gridgrid = [[0]*10 for x in range(10)]。 它按預期工作。

grid = [[0]*10 for x in range(10)] 

grid[0][0] = 1 

for l in grid: 
    print l 

輸出:

[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

有誰知道爲什麼會這樣?

謝謝你的幫助!

回答

2

當您創建grid = [[0]*10]*10時,實際上是在創建一個對的引用數組,該對象是([0] s的列表)。所以當你通過一個引用改變對象時,這會改變列表中的所有條目。

對於初學者來說,這是一個非常常見的Python'gotcha'。

+0

是@安德魯是正確的。 #說明 grid = [[0] * 10] * 10#在這裏啓動一個列表並分配給grid grid = [[0] * 10 for x in range(10)]#這裏構造一個列表並分配到電網 –

相關問題