1. 程式人生 > 其它 >女朋友問我深淺copy到底是什麼?

女朋友問我深淺copy到底是什麼?

深淺拷貝

列表存放值的時候,是先申請一塊記憶體空間,存放索引和記憶體地址的對應關係,其實通俗的來說列表內不存真正的值,是一種間接存放的對應關係;

  • 列表記憶體不可變型別的資料

就比如說,如果現在將L列表索引0位置的值修改為66,那麼這個過程發生了什麼?通俗理解為去L[0]去值11的路被銷燬了,現在通往了值66,那麼這個對應關係就修改了,再次索引出來的L[0]就是66

不管是一維的還是二維的道理都是如此;

二維

淺拷貝

只拷貝了一層,後續需要結合可變與不可變型別理解來決定,

如果一維列表內沒有可變型別,其實淺拷貝的影響並不大,如果一維列表內有可變型別的元素,那麼就會造成影響

l = [11,22,['xx','yy']]
'''l列表是二維的,列表套列表的結構'''

# 淺拷貝
new_l = [:]
# 修改原列表
l[2][0] = 'zz'
print('新列表',new_l) # 新列表 [11,22,['zz','yy']]
print('源列表',l)    # 原列表 [11,22,['zz','yy']]
print(id(l[0]),id(l[1]),id(l[2]))   # 1627619440 1627619472 2225456877448
print(id(new_l[0]),id(new_l[1]),id(new_l[2]))  # 1627619440 1627619472 2225456877448
'''
總結:不論修改原列表還是新列表,修改列表內的不可變型別元素不會對原列表或新列表造成影響,如果修改的是列表內的可變型別元素,那麼原列表或新列表會隨著修改而修改
原理:拷貝對於不可變型別來說拷貝的是值,但是拷貝對於可變型別元素來說拷貝的是對應關係,可以通過檢視原列表和新列表的id值來驗證,id值是一樣的	
'''

總結:不論修改原列表還是新列表,修改列表內的不可變型別元素不會對原列表或新列表造成影響,如果修改的是列表內的可變型別元素,那麼原列表或新列表會隨著修改而修改

原理:拷貝對於不可變型別來說拷貝的是值,但是拷貝對於可變型別元素來說拷貝的是對應關係,可以通過檢視原列表和新列表的id值來驗證,id值是一樣的

修改值發生了什麼變化?

不可變型別:任然不變

可變型別:跟著改變

深拷貝

深拷貝其實就是對淺拷貝不能處理的可變型別進行處理,對應關係更深一層copy;

我們潛意識理解的拷貝,拷貝出來一份你玩你的我玩我的互不影響,深copy就做到如此;

匯入:from copy import deepcopy

from copy import deepcopy
l = [11,22,['xx','yy']]
new_l = deepcopy(l)
print(l,id(l))  # [11, 22, ['xx', 'yy']] 1305767841288
print(new_l,id(new_l))  # [11, 22, ['xx', 'yy']] 1305767841352
print(id(l[0]),id(l[1]),id(l[2]))  # 1627619760 1627620112 2688776670984
print(id(new_l[0]),id(new_l[1]),id(new_l[2]))  # 1627619760 1627620112 2688776669256

'''
列表的id值不一樣就代表著這兩個列表是不同的列表,兩個完全不一樣的物件,子列表也是一樣
'''
'''不可變型別的id還是一樣,不可變型別的id就不一樣了,那麼列表就相當於造了一個新的列表了'''

現在再修改哪個值都不會對原列表或新列表有影響現在修改值只需修改對應關係再指向新值就可以了