copy就是複製乙份,也就是所謂的抄乙份。深淺copy其實就是完全複製乙份,和部分複製乙份的意思。
l1 = [1,2,3,['barry','alex']]
l2 = l1
l1[0] = 111
print(l1) # [111, 2, 3, ['barry', 'alex']]
print(l2) # [111, 2, 3, ['barry', 'alex']]
l1[3][0] = 'wusir'
print(l1) # [111, 2, 3, ['wusir', 'alex']]
print(l2) # [111, 2, 3, ['wusir', 'alex']]
對於賦值運算來說,l1和l2指向的是同乙個記憶體位址,所以它們是完全一樣的,任何乙個變數對列表進行改變,剩下的那個變數在使用了列表之後,這個列表就是發生改變之後的列表
值相同,不可變型別滿足同一**塊快取機制,可變型別記憶體位址都相同
# 同一**塊下
l1 = [1, '太白', true, (1,2,3), [22, 33]]
l2 = l1.copy()
print(id(l1), id(l2)) # 2713214468360 2713214524680
print(id(l1[-2]), id(l2[-2])) # 2547618888008 2547618888008
print(id(l1[-1]),id(l2[-1])) # 2547620322952 2547620322952
#不能同**塊下
>>> l1 = [1, '太白', true, (1, 2, 3), [22, 33]]
>>> l2 = l1.copy()
>>> print(id(l1), id(l2))
1477183162120 1477183162696
>>> print(id(l1[-2]), id(l2[-2]))
1477181814032 1477181814032
>>> print(id(l1[-1]), id(l2[-1]))
1477183162504 1477183162504
對於淺copy來說,只是在記憶體中重新建立了開闢了乙個空間存放乙個新列表,但是列表中的元素與原列表中的元素是公用的(也就是說記憶體位址一致,乙個改變的同時另乙個也會跟著改變!!)
如果兩元素或者多個元素指向同一記憶體位址,那麼它們的值就是相同的,其中乙個元素改變了,
那麼因為它們的記憶體位址相同,所以其他的元素的值就跟著一起改變。
>>> l1 = [1,2,3,[22,444]]
>>> l2 = l1
>>> l1[0] = [4] # l1中[0]的記憶體位址與l2中的相同
>>> l1
[[4], 2, 3, [22, 444]]
>>> l2
[[4], 2, 3, [22, 444]]
>>> l1 + [22,333] # l1的記憶體位址跟l2的不同
[[4], 2, 3, [22, 444], 22, 333]
>>> l2
[[4], 2, 3, [22, 444]]
要引入python標準庫 copy
值相同,不可變型別滿足小資料池,
可變型別記憶體位址都不相同
# 同一**塊下 不可變型別滿足**塊快取機制
import copy
l1 = [1, 'alex', true, (1,2,3), [22, 33]]
l2 = copy.deepcopy(l1)
print(id(l1), id(l2)) # 2788324482440 2788324483016
print(id(l1[0]),id(l2[0])) # 1470562768 1470562768
print(id(l1[-1]),id(l2[-1])) # 2788324482632 2788324482696
print(id(l1[-2]),id(l2[-2])) # 2788323047752 2788323047752
# 不同**塊下 不可變型別滿足小資料池
>>> import copy
>>> l1 = [1, '太白', true, (1, 2, 3), [22, 33]]
>>> l2 = copy.deepcopy(l1)
>>> print(id(l1), id(l2))
1477183162824 1477183162632
>>> print(id(0), id(0))
1470562736 1470562736
>>> print(id(-2), id(-2))
1470562672 1470562672
>>> print(id(l1[-1]), id(l2[-1]))
1477183162120 1477183162312
深copy的特性就是將可變的資料型別在記憶體中重新建立乙份,而不可變的資料型別則沿用之前的
對於深copy來說,列表是在記憶體中重新建立的,列表中的可變的資料型別就是重新建立的,
列表中的不可變的資料型別是公用的
l1 = [1, 2, 3, 4, ['alex']]
l2 = l1[::]
print(l2) #[1, 2, 3, 4, ['alex', 666]]
python深淺複製 Python中的深淺拷貝
1.什麼是深淺拷貝?python中一切皆物件,python中的數字 字串 元組等,如果存放在了記憶體中,這部分記憶體裡面的內容是不會改變的,但是也有情況,記憶體中存放了可變物件,比如說列表和字典,他們的記憶體空間是可以被修改的。下面我們定義乙個列表 list 1,2,3,4,5 list1 list...
Python 中的深淺拷貝
python 中的物件之間賦值時,時按照引用傳遞,如果需要拷貝物件 需要使用標準庫中的copy模組 1.copy.copy淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件 2.copy.deepcopy深拷貝 拷貝物件及其子物件 示例 encoding utf 8 import copy a 1,2...
Python中的深淺copy
在python中的深淺copy和其他語言中的不同,在c語言中,只要位址發生變化的都是深copy,位址不發生變化的都是淺copy。但是在python中卻不一樣,在python中分兩種情況來解釋深淺copy。第一種情況,當列表中不存在其他其他列表元素的時候,這個時候深copy和淺copy是相同的,都是建...