圖解Python中的淺拷貝和深拷貝
Python淺拷貝和深拷貝
最直觀的理解就是:
1.深拷貝,拷貝的程度深,自己新開辟了一塊內(nèi)存,將被拷貝內(nèi)容全部拷貝過來了;
2.淺拷貝,拷貝的程度淺,只拷貝原數(shù)據(jù)的首地址,然后通過原數(shù)據(jù)的首地址,去獲取內(nèi)容。
兩者的優(yōu)缺點對比
(1)深拷貝拷貝程度高,將原數(shù)據(jù)復(fù)制到新的內(nèi)存空間中。改變拷貝后的內(nèi)容不影響原數(shù)據(jù)內(nèi)容。但是深拷貝耗時長,且占用內(nèi)存空間。
(2)淺拷貝拷貝程度低,只復(fù)制原數(shù)據(jù)的地址。其實是將副本的地址指向原數(shù)據(jù)地址。修改副本內(nèi)容,是通過當(dāng)前地址指向原數(shù)據(jù)地址,去修改。所以修改副本內(nèi)容會影響到原數(shù)據(jù)內(nèi)容。但是淺拷貝耗時短,占用內(nèi)存空間少。
淺拷貝
有一層數(shù)據(jù)類型,且數(shù)據(jù)類型時可變數(shù)據(jù)類型,例如:列表、字典
有一層數(shù)據(jù)類型,且數(shù)據(jù)類型時不可變數(shù)據(jù)類型,例如:元組、字符串
有兩層數(shù)據(jù)類型,外層為可變數(shù)據(jù)類型,內(nèi)層為可變數(shù)據(jù)類型
有兩層數(shù)據(jù)類型,外層為可變數(shù)據(jù)類型,內(nèi)層為不可變數(shù)據(jù)類型
有兩層數(shù)據(jù)類型,外層為不可變數(shù)據(jù)類型,內(nèi)層為不可變數(shù)據(jù)類型
有兩層數(shù)據(jù)類型,外層為不可變數(shù)據(jù)類型,內(nèi)層為可變數(shù)據(jù)類型
深拷貝
有一層數(shù)據(jù)類型,且數(shù)據(jù)類型時可變數(shù)據(jù)類型,例如:列表、字典
有一層數(shù)據(jù)類型,且數(shù)據(jù)類型時不可變數(shù)據(jù)類型,例如:元組、字符串
有兩層數(shù)據(jù)類型,外層為可變數(shù)據(jù)類型,內(nèi)層為可變數(shù)據(jù)類型
有兩層數(shù)據(jù)類型,外層為可變數(shù)據(jù)類型,內(nèi)層為不可變數(shù)據(jù)類型
有兩層數(shù)據(jù)類型,外層為不可變數(shù)據(jù)類型,內(nèi)層為不可變數(shù)據(jù)類型
有兩層數(shù)據(jù)類型,外層為不可變數(shù)據(jù)類型,內(nèi)層為可變數(shù)據(jù)類型
由實驗結(jié)果總結(jié)得:
當(dāng)內(nèi)層為可變數(shù)據(jù)類型時,深拷貝后內(nèi)層外層地址均發(fā)生改變。當(dāng)內(nèi)層為不可變數(shù)據(jù)類型時,外層不管是可變還是不可變數(shù)據(jù)類型,使用深拷貝,都不會改變內(nèi)層地址,只會在外層為可變數(shù)據(jù)類型時,改變外層地址。
使用淺拷貝是只能在外層數(shù)據(jù)類型為可變數(shù)據(jù)類型時,才能改變外層地址。而內(nèi)層地址,無論是否為可變數(shù)據(jù)類型還是不可變數(shù)據(jù)類型,使用淺拷貝都不會改變內(nèi)層數(shù)據(jù)類型地址。
到此這篇關(guān)于圖解Python中的淺拷貝和深拷貝的文章就介紹到這了,更多相關(guān)Python淺拷貝和深拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用MapReduce編程模型統(tǒng)計銷量
MapReduce是面向大數(shù)據(jù)并行處理的計算模型、框架和平臺,是一種計算引擎,可以把我們對大批量數(shù)據(jù)的計算通過抽象成map與reduce兩個子任務(wù)進(jìn)行計算從而更快的得到想要的結(jié)果2022-04-04python實現(xiàn)微信每日一句自動發(fā)送給喜歡的人
這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)微信每日一句自動發(fā)送給喜歡的人,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04Python3進(jìn)制之間的轉(zhuǎn)換代碼實例
這篇文章主要介紹了Python3進(jìn)制之間的轉(zhuǎn)換代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08