有部分參考資料:
from copy import copy,deepcopy
l = [1,2,3,4,[1,2,3]]
new_l = l
copy_l = copy(l)
deepcopy_l = deepcopy(l)
print('l',id(l))
print('new_l',id(new_l))
print('copy_l',id(copy_l))
print('deepcopy_l',id(deepcopy_l))
l 12727752
new_l 12727752
copy_l 12401416
deepcopy_l 12727432
從上面的結果可以看出 l 與被賦值物件 new_l的記憶體位址時一樣的,淺拷貝和深拷貝 後的物件的記憶體位址與原始資料的記憶體位址都不一樣,在記憶體中開闢了一塊新的記憶體空間。
現在分別來看物件中的不可變元素的id值和可變元素的id值
print('l[1]',id(l[1]),'l[-1]',id(l[-1]))
print('new_l[1]',id(new_l[1]),'new_l[-1]',id(new_l[-1]))
print('copy_l[1]',id(copy_l[1]),'copy_l[-1]',id(copy_l[-1]))
print('deepcopy_l[1]',id(deepcopy_l[1]),'deepcopy_l[-1]',id(deepcopy_l[-1]))
結果:l[1] 1488257552 l[-1] 12729672
new_l[1] 1488257552 new_l[-1] 12729672
copy_l[1] 1488257552 copy_l[-1] 12729672
deepcopy_l[1] 1488257552 deepcopy_l[-1] 12729480
從上面的執行結果可以看出:
3.深拷貝:在記憶體中的另一塊位址中建立乙個新的變數,深拷貝建立的新變數中 不可變元素與原始物件中的不可變元素的位址相同,但是可變元素與原始物件中的可變元素的位址時不同的,也就是進行了深層次的拷貝。
print(copy_l)
print(l)
# 結果
[1, 2, 3, 4, [1, 2, 3]]
[1, 2, 3, 4, [1, 2, 3], 9]
如果改變原始資料中的不可變元素,淺拷貝建立的變數copy_l,值不會改變,如果改變原始資料中的可變元素,淺拷貝建立的變數,值是會相應的改變。
print(copy_l)
print(l)
# 結果
[1, 2, 3, 4, [1, 2, 3, 9]]
[1, 2, 3, 4, [1, 2, 3, 9]]
淺拷貝建立的物件,改變該物件中的不可變元素,對原始資料不會產生影響,改變該物件中的可變元素,原始資料也會改變。
print(l)
print(copy_l)
# 結果
[1, 2, 3, 4, [1, 2, 3, 9]]
[1, 2, 3, 4, [1, 2, 3, 9]]
print(l)
print(copy_l)
# 結果
[1, 2, 3, 4, [1, 2, 3]]
[1, 2, 3, 4, [1, 2, 3], 9]
小結淺拷貝:淺拷貝建立的物件 中的元素位址與原始物件中的元素位址是相同的,那麼兩者是相互影響的,只要其中任意乙個物件中的可變元素改變,另乙個物件也會改變。
new_l = l
copy_l = copy(l)
deepcopy_l = deepcopy(l)
print(l)
print(deepcopy_l)
# 結果
[1, 2, 3, 4, [1, 2, 3, 10]]
[1, 2, 3, 4, [1, 2, 3]]
小結深拷貝:在記憶體中開闢另外一塊空間,深拷貝建立的物件位址與原始物件位址不同,但是該物件中的不可變元素與原始物件中的不可變元素位址相同,而可變位址不同,也就是說,無論是原始物件改變還是該物件改變,都不會影響對方的值。是完全的副本。 python中賦值引用 淺拷貝 深拷貝
t 1,2,2 defmain n n 0 3 return n main t print t 輸出是t 3,2,2 同樣,使用return的返回值也是一樣的結果,因為無論怎麼說,在python中的賦值都是引用,變數本身就是乙個標籤,只是我們可以通過變數取訪問記憶體中的資料而已。在實際的使用過程中如...
python中的賦值 淺拷貝 深拷貝
在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 import copy a 1,2,x y b ac copy.copy a d copy.deepcopy a print id b id a i...
Python中賦值 淺拷貝與深拷貝
原文 python中關於物件複製有三種型別的使用方式,賦值 淺拷貝與深拷貝。他們既有區別又有聯絡,剛好最近碰到這一類的問題,研究下。一 賦值 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 list a 1,2,3,hello python c list b list a 這種...