淺談,深淺拷貝

首先呢,深淺拷貝,都是對對象的拷貝,生成一個看起來一樣的值,但是本質(zhì)區(qū)別就是他們的地址一不一樣,到底是拷貝地址,還是拷貝值!!!

深淺拷貝最明顯的區(qū)別就是可變元素的拷貝

淺拷貝:

拷貝出來新的對象地址和原對象不一樣,但是如果源對象中元素包含可變元素(list,dict,set)之內(nèi)的,那么可變元素的地址和原對象的地址是一樣的!
可以說淺拷貝是淺層的數(shù)據(jù)結(jié)構(gòu)(不可變元素)的拷貝,如果對其中一個對象里面的可變元素修改,那么兩個對象這部分的值都會變修改,因為這部分地址是一樣的!

深拷貝

拷貝出來的新對象,不管淺層還是深層的地址都是獨立的,和原對象不一樣,所以原對象的任何修改對深拷貝對象沒有影響!

光文字不夠形象,下面上自己做的一道小菜,希望能夠幫你開開胃:

import copy
a = [1, 2, 3, 4, ['a', 'b']]
# 賦值
b = a
# 淺拷貝
c = copy.copy(a)
# 深拷貝
d = copy.deepcopy(a)
# 對原對象進行淺層的數(shù)據(jù)修改
a.append(6)
# 對原文件進行深層的數(shù)據(jù)修改
a[4].append('c')
# 可以看出,同內(nèi)存地址的對象進行任意一方修改,雙方都會改變
b.append(7)
print(a, id(a), id(a[4]))
print(b, id(b), id(b[4]))
print(c, id(c), id(c[4]))
print(d, id(d), id(d[4]))

運行結(jié)果如下:

[1, 2, 3, 4, ['a', 'b', 'c'], 6, 7] 37063752 37063560
[1, 2, 3, 4, ['a', 'b', 'c'], 6, 7] 37063752 37063560
[1, 2, 3, 4, ['a', 'b', 'c']] 37167496 37063560
[1, 2, 3, 4, ['a', 'b']] 37167432 37167368
[Finished in 0.1s]

從程序運行結(jié)果來看
1.賦值,是直接引用源對象的地址,就是同一個東西,所有只要一個對象發(fā)生修改,不改是淺層還是深層的元素,等于原地址發(fā)生了修改,所以另一個對象也會改變.
2.淺拷貝,有點藕斷絲連的意思,整體的指向地址和源對象不同,深層次元素地址相同在淺層添加元素時,淺拷貝對象不變,但是深層元素發(fā)生修改時,兩個對象都會改變.
3.深拷貝,就是離婚了,你過你的,我過我的,不管淺層還是深層元素發(fā)生修改,都是對各自的改變,因為各自深層次和淺層次元素地址都不一樣.

不可變元素(int,str,float,tuple...)
可變(list,dict,set)
希望能夠幫助你!謝謝觀看!!!??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 進入本主題之前首先需要了解一些準備知識! 那就是地址與指針的關(guān)系:計算機的內(nèi)存儲器被劃分為一個個的內(nèi)存單元。內(nèi)存單...
    八匹馬_BPM閱讀 642評論 2 0
  • 在進行iOS開發(fā)時候,深拷貝很多人不經(jīng)常用,但是有時候出了bug,追查很久,才發(fā)現(xiàn)是深淺拷貝的問題,往往浪費很多時...
    蠟筆小強閱讀 254評論 0 2
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,656評論 1 32
  • 簡述深淺拷貝 我們實例化的對象存儲在堆區(qū),而指向?qū)ο蟮闹羔樢话愦鎯υ跅^(qū)。我們需要知道這個前提。??實際上拷貝分為...
    朽木自雕也閱讀 644評論 1 3
  • 1.設(shè)計模式是什么? 你知道哪些設(shè)計模式,并簡要敘述?設(shè)計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,302評論 0 12

友情鏈接更多精彩內(nèi)容