1. 程式人生 > >【Python】list陣列賦值

【Python】list陣列賦值

list陣列對於python帶來了很大的方便,在陣列中存入資料時不用有那麼多的顧慮,但是對list陣列賦值時要特別的注意,若是賦值不當很容易會改變原陣列的值。

1,對一維陣列來說使用賦值符號會影響原陣列

如下程式碼:

li_a=[2,3,4,6,8]
li_c=li_a
li_c[0]=11
li_c[1]=11
print(li_c)
print(li_a)
將一維陣列li_a賦值給陣列li_c,然後只更改li_c的前兩個數值。但是從最後的輸出來看兩個陣列中前兩個的數值都被改變了。
print(li_a is li_c)
使用is語句可得到“TRUE”的結果,可見當我們使用賦值符號時,li_a和li_c其實共享一片記憶體地址,當對li_c改變時li_a也會改變。

2,可以通過淺拷貝的方式來避免原陣列的影響

淺拷貝的方式有很多,如下程式碼所示:

li_a=[2,3,4,6,8]
li_c=li_a
li_b=li_a[:]    #切片方式
li_d=list(li_a)  #list
print(li_a is li_c)
print(li_a is li_b)
print(li_a is li_d)
輸出結果為:“True  False  False”

3,對二維陣列賦值需要注意的問題

但是對於二維陣列來說賦值和淺拷貝有時候確實無法避免對原陣列的影響,如下程式碼所示:

li_a=lq
li_b=lq[:]
li_c=list(lq)
li_c[0][0]=0
li_c[0][2]=0
li_c[0][1]=0
li_c[1][1]=100
li_c[1][2]=100
print(li_c)
print(lq)
使用list形式對定義陣列li_c,並以單個元素的形式改變陣列li_c的某些值,結果在最後的輸出結果中不僅li_c中的陣列發生改變,lq中的陣列也發生了改變!
[[0, 0, 0, 8], [5, 100, 100, 23], [34, 2, 3, 9], [8, 4, 5, 6], [34, 2, 3, 9]]
[[0, 0, 0, 8], [5, 100, 100, 23], [34, 2, 3, 9], [8, 4, 5, 6], [34, 2, 3, 9]]
若是直接是對二維陣列中的一行進行改變,卻不影響原陣列的值:
li_c[2]=[3,3,3,3]
最後的輸出結果中陣列lq並沒有改變:
[[0, 0, 0, 8], [5, 100, 100, 23], [3, 3, 3, 3], [8, 4, 5, 6], [34, 2, 3, 9]]
[[0, 0, 0, 8], [5, 100, 100, 23], [34, 2, 3, 9], [8, 4, 5, 6], [34, 2, 3, 9]]
不過對於需要單元素的改變陣列的值有不影響原陣列,可使用下面程式碼初始化陣列:
lq=[[3,4,7,8],[5,4,3,23],[34,2,3,9],[8,4,5,6],[34,2,3,9]]
lq_hang=len(lq)
lq_lie=len(lq[0])
li_real=[[0]*lq_lie for i in range(lq_hang)]
li_real[0][0]=10
li_real[0][2]=10
li_real[0][1]=10
li_real[1][1]=100
li_real[1][2]=100
print(li_real)
print(lq)
結果為:
[[0, 0, 0, 0], [0, 100, 100, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[3, 4, 7, 8], [5, 4, 3, 23], [34, 2, 3, 9], [8, 4, 5, 6], [34, 2, 3, 9]]