1. 程式人生 > >這裡遇到的一個小坑-python中的二維列表

這裡遇到的一個小坑-python中的二維列表

緣起於某個同學問了我一個問題(我自己學的話萬萬不會摳得那麼深...)

他的程式是這樣的:

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