Python的嵌套列表就是在列表中包含一個列表,除了手動創(chuàng)建外,可以用乘法
a=[[0]*3]*3
print(a)
#輸出結(jié)果為:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
這樣看起來好像沒問題呀,但實(shí)際上呢?我們對其中一個元素進(jìn)行賦值
a=[[0]*3]*3
a[0][0]=1
print(a)
#輸出結(jié)果為:[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
出乎意料的是,我們原本只想改變一個值,結(jié)果更改了3個值,那就說明這種方法創(chuàng)建嵌套列表是出錯誤的。
出現(xiàn)這樣的結(jié)果,我們可以猜想是不是把[[0]*3]作為一個對象進(jìn)行了復(fù)制,指向同一個地址,并沒有創(chuàng)建新的列表對象
print(id(a[0]))
print(id(a[1]))
print(id(a[2]))
#輸出:
2731945169024
2731945169024
2731945169024
結(jié)果輸出的值一模一樣。事實(shí)上,我們把列表直接賦值給另一個列表后,修改其中一個的值,也會出現(xiàn)這樣的情況,我們可以借助pythontutor這個網(wǎng)站,來看一下創(chuàng)建過程,附上網(wǎng)站鏈接(pythontutor)

可以看到與我們猜想的一致,那么該怎么正確創(chuàng)建呢?
a = [[0]*3 for _ in range(3)]
a[0][0]=1
print(a)
