python二維數(shù)組重復(fù)賦值問題

今天在寫程序時遇到一個怪異的問題,采用雙重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中的深拷貝和淺拷貝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,804評論 1 118
  • 個人筆記,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,948評論 0 5
  • 前言 Python的創(chuàng)始人為Guido van Rossum。1989年圣誕節(jié)期間,在阿姆斯特丹,Guido為了打...
    依依玖玥閱讀 3,706評論 6 37
  • 昨天晚上到1點(diǎn)左右才回到客棧,此前一直在古城,8點(diǎn)左右出去的,然后在古城賣花。因為昨天七夕,然后和...
    天空藍(lán)上閱讀 289評論 0 0
  • 馬上就要十一長假了。 今天到單位上班,已然可以感受到節(jié)日氛圍,來的人少了,郵件電話都少了(其實自己要做的事一點(diǎn)沒少...
    小easy閱讀 277評論 3 1

友情鏈接更多精彩內(nèi)容