這裡遇到的一個小坑-python中的二維列表
阿新 • • 發佈:2019-01-31
緣起於某個同學問了我一個問題(我自己學的話萬萬不會摳得那麼深...)
他的程式是這樣的:
listx=[]
graph=[]
for a in range(0,10):
listx.append(99999)
for b in range(0,10):
graph.append(listx)
graph[0][0]=0
print graph
他原意是想就給這個二維列表的第一行第一列賦值0 即graph[0][0]=0,然而卻出現了以上的結果...
經過一系列的 "怎麼會!不可能啊!奇怪...!!!" 後,這個結果的原因是:
他給graph新增的是個元素始終都是listx這個列表,因此,graph所有元素的值都是listx的一個淺複製。他們都指向同一個地址,即listx的記憶體地址,因此只要改變graph當中一個元素的值,就會影響到其他元素。所以如上例,當將graph第一行第一列的值由9999變為0後,其他行也發生了改變。
下面是修改後的程式碼:
graph = [[] for i in range(10)]
for a in range(0,10):
for b in range(0,10):
graph[a].append(9999)
graph[0][0]=0
print graph