當我想更新矩陣的一個元素(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]]
當我想更新矩陣的一個元素(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]]
替換此行:
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]*2
創建一次。然後,外部*2
使用相同的對象來創建外部數組(通過對同一對象[0]*2
進行2次引用)。
因此,當你修改任何一個,另一個也將被修改。事實上,他們是同一個對象。
謝謝所有人。你們都是對的。以下是我從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]
「誰希望看到更多的細節」,建議看文檔,而不是這裏。 (因爲這不是一個權威的來源,它可能遲早會過時。)在這個答案中,我沒有看到太多的價值 –