那我們今天再來看一下這個面試問題:淺拷貝和深拷貝有什么區(qū)別?
你如果說到Python,這個問題會經(jīng)常被問到(方便理解我們就可以直接把它理解成Ctrl+C/Ctrl+V復(fù)制copy)當(dāng)然在代碼里面復(fù)制粘貼不僅僅是大家看到的,就是說在代碼的世界里面,有很多的東西。
就好像代碼里面有一個is == 看起來這兩個沒有區(qū)別
比如說
a is b
a==b

看起來沒什么區(qū)別,看起來相等。但其實它們有很大的區(qū)別。
就好像我們的深復(fù)制和淺復(fù)制,也是一樣的,你導(dǎo)入一個模塊(copy)我定義一個a等于一個列表(1,2,3,4)
然后我們?nèi)ミM行淺復(fù)制和深復(fù)制。
淺復(fù)制
b==copy里面的一個方法,
b=copy.copy(a)#淺復(fù)制
那這個是淺復(fù)制
深復(fù)制
C=copy .deepcopy(a)
我們再來打印一下,abc

打印出來都是一模一樣的,沒有毛病,這個時候大家看不出任何的效果。
那我在前面有說,淺復(fù)制深復(fù)制他們最明顯的區(qū)別就是:淺拷貝最基本的,沒有拷貝子對象
那什么叫子對象?
所以說這個數(shù)據(jù)類型就
a=[1,2,3,4]這個列表里面可不可以有列表?比如說我就又定義一個a一個b
a=[1,2,3,4,[ 'a' , 'b ' ]]
打印一下,其實還是一樣的,因為它們是一個整體。
那為什么說淺復(fù)制沒有拷貝子對象呢,我們接著來看
a.去做一個更改,列表可以去添加元素對吧嗎,append
這個列表a去添加一個元素,那這是第幾個元素?那么索引就是4
我的意思就是a=[1,2,3,4,[ 'a' , 'b ' c'?]]想要在里面再加一個c這樣的元素,我們用代碼
a[4].append( 'c ')
那我們再來運行看下效果?

打印為什么還是三行都是一樣的,問題在哪里,是因為在復(fù)制在前就把這個元素添加了,你要在復(fù)制之后。我去改一下代碼順序,這個時候效果就出來了,這個就是它們之間的區(qū)別。
那它們之間的id是不是一樣的呢,id肯定也是不一樣的,一起來看一下它們之間的id。都是不同的對象了
print(id(a))
print(id(b))
print(id(c))
雖然都是復(fù)制過來的,但是它們已經(jīng)不是同一個東西了,復(fù)制過來,打印adc,三個id都不一樣了

所以這就是它們之間一些基本的區(qū)別,這些代碼大家可以在電腦上敲一遍,理解一下。
加深印象:
淺拷貝沒有拷貝子對象,就是說我去淺拷貝,它們雖然是一個固定的對象,子對象是統(tǒng)一的,深度拷貝就是兩者完全獨立了
只要記住深拷貝,你之前是這個樣子

我拷貝之后,不管你做什么增刪改查,我還是這個樣子

完全獨立了。
那么淺拷貝就還沒有完全獨立,子對象還是之前的子對象,我這個子對象加了一個c元素,打印后能顯示它添加的子元素,所以你記住深拷貝兩者之間完全獨立
如果代碼接觸(敲)的少,看上去好像這個東西很簡單,或者這個概念你讀一遍也很簡單,但是你需要多去敲一些這樣的代碼,深拷貝淺拷貝在很多語言里面都有,我們自動化,測試框架里面用得還是比較多的。
1、點贊。防止以后找不到,想看的時候,在自己主頁就能找到了,很方便;
2、關(guān)注我。讓我們成為長期關(guān)系,下一個視頻會分享更多的硬核干貨;?
3、本文章學(xué)習(xí)資源,均可以免費分享。
微信公號:程序員一凡。這樣的好內(nèi)容,里面還有近百篇。? 謝謝你的支持!