2014-02-24 470 views
0

當我想更新矩陣的一個元素(1,1)時,(0,1)和(1,1)都會更新,爲什麼它是這樣的?更新列表中的值

In [188]: matrix_res = [[0]*2]*2 

In [189]: matrix_res 

Out[189]: [[0, 0], [0, 0]] 

In [190]: matrix_res[1][1] = 1 

In [191]: matrix_res 

Out[191]: [[0, 1], [0, 1]] 

回答

0

替換此行:

matrix_res = [[0]*2]*2 

與此:

matrix_res = [[0 for i in range(2)] for j in range(2)] 

或者乾脆:

matrix_res = [[0, 0], [0, 0]] 

原因:matrix_res = [[0]*2]*2實際上有只有一個內部列表中創建的並且matrix_res中的兩個子列表都被標記爲只有一個。

0

這是因爲[0]*2創建一次。然後,外部*2使用相同的對象來創建外部數組(通過對同一對象[0]*2進行2次引用)。

因此,當你修改任何一個,另一個也將被修改。事實上,他們是同一個對象。

0

謝謝所有人。你們都是對的。以下是我從Python文檔中獲取的有關想要查看更多詳細信息的信息:

============================ =============================

n小於0的值被視爲0(它產生一個空序列與s相同)。還要注意,副本很淺;嵌套結構不會被複制。這經常困擾着新的Python程序員;考慮:

>>>

>>>列出= [[]] * 3

>>>列出 [[],[],[]]

>>>列表[0] .append(3)

>>>列出 [[3],[3],[3]]

什麼的情況是[[]]是一元素列表包含一個空列表,所有三個[[]] * 3的元素是(指向)這個單個空列表。修改列表的任何元素都會修改此單個列表。可以創建不同的列表的列表是這樣的:

>>>

>>>列出= [[]爲i的範圍(3)]

>>>列表[0]。追加(3)

>>>列表[1] .append(5)

>>>列表[2]。追加(7)

>>>列出

[3],[5],[7]

+0

「誰希望看到更多的細節」,建議看文檔,而不是這裏。 (因爲這不是一個權威的來源,它可能遲早會過時。)在這個答案中,我沒有看到太多的價值 –