今天在寫程序時遇到一個怪異的問題,采用雙重for循環(huán)對一個二維數(shù)組中的每一個元素進(jìn)行賦值,結(jié)果發(fā)現(xiàn),它們的每一列都一起改變了。例子如下:
k = 0
a = [[0] * 3] * 3
for i in range(3):
for j in range(3):
a[i][j] = k
k += 1
print(a)
運(yùn)行結(jié)果:
[[6, 7, 8], [6, 7, 8], [6, 7, 8]]
百思不得其解,搜索得知,Python中的list屬于一個可變對象,那么對它進(jìn)行賦值時,會進(jìn)行一個淺拷貝。所謂淺拷貝,我們可以把它理解為引用,僅僅復(fù)制了容器中元素的地址,改變其中一個,其對應(yīng)的值也會隨之改變。
例如:
arr = [0,1,2,3]
arr = [arr]*2
arr[0][0] = 100
arr[1][3] = 200
print(arr)
運(yùn)行結(jié)果:
[[100, 1, 2, 200], [100, 1, 2, 200]]
為了防止這種淺拷貝,我們需要換個方式來創(chuàng)建二位數(shù)組
a = [([0] * 3) for p in range(3)]
這樣我們就避免了淺拷貝帶來的影響(意外中改變了值)
我們在進(jìn)行一次實驗:
k = 0
a = [([0] * 3) for p in range(3)]
for i in range(3):
for j in range(3):
a[i][j] = k
k += 1
print(a)
運(yùn)行結(jié)果:
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
解決!
參考鏈接:
Python 二維數(shù)組賦值
python的二維數(shù)組操作
談?wù)刾ython中的深拷貝和淺拷貝