標籤:div print 複製 size 中間 相同 修改 地址 lis
首先我們需要明確列表的深淺複製是針對被嵌套的列表而言的,也就是說只有對嵌套列表我們才需要考慮這個問題。來看例子。
list1=[‘老大‘,‘老二‘,[‘老三‘,‘老四‘,‘老五‘],‘老六‘,‘老七‘]list2=list1.copy()print(list1,‘\n‘,list2) #列印兩個列表print(id(list1),‘\n‘,id(list2)) #列印兩個列表的地址print(id(list1[2]),‘\n‘,id(list2[2])) #列印兩個嵌套列表的地址
運行結果
[‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘] [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]3072878348 30725616443072841164 3072841164
從結果中可以看出,雖然list1與liat2的地址相同,但是嵌套的列表[‘老三‘, ‘老四‘, ‘老五‘]卻有著相同的地址。這就是一種淺複製。如果此時我們修改嵌套列表的值。兩個列表就都會發生改變。看下面的代碼。
list1[2][1]=‘哈哈哈‘print(list1,‘\n‘,list2)
運行結果
[‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘] [‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘]
其實原理非常簡單,中間被嵌套的列表實際上是單獨被分配的空間,然後list1和list2都是去引用的地址,所以當它的值改變,兩個列表就都跟著變了。
深複製
深複製需要用到copy模組,來看例子。
import copylist1=[‘老大‘,‘老二‘,[‘老三‘,‘老四‘,‘老五‘],‘老六‘,‘老七‘]list2=copy.deepcopy(list1)print(list1,‘\n‘,list2) #列印兩個列表print(id(list1),‘\n‘,id(list2)) #列印兩個列表的地址print(id(list1[2]),‘\n‘,id(list2[2])) #列印兩個嵌套列表的地址
結果
[‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘] [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]3071562732 30719289403071600076 3071600108
這是我們如果修改嵌套的列表的值,兩個列表會發生什麼變化呢?
list1[2][1]=‘哈哈哈‘print(list1,‘\n‘,list2)
結果
[‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘] [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]
Python基礎(五):列表的深淺複製