欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

深拷貝函數(shù)python 深淺拷貝實(shí)現(xiàn)方法

python 為什么有深拷貝淺拷貝

在寫Python過程中,經(jīng)常會遇到對象的拷貝,如果不理解淺拷貝和深拷貝的概念,你的代碼就可能出現(xiàn)一些問題。所以,在這里按個人的理解談?wù)勊鼈冎g的區(qū)別。

成都創(chuàng)新互聯(lián)公司:從2013年創(chuàng)立為各行業(yè)開拓出企業(yè)自己的“網(wǎng)站建設(shè)”服務(wù),為成百上千家公司企業(yè)提供了專業(yè)的網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計和網(wǎng)站推廣服務(wù), 按需網(wǎng)站策劃由設(shè)計師親自精心設(shè)計,設(shè)計的效果完全按照客戶的要求,并適當(dāng)?shù)奶岢龊侠淼慕ㄗh,擁有的視覺效果,策劃師分析客戶的同行競爭對手,根據(jù)客戶的實(shí)際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領(lǐng)先地位的。

一、賦值(assignment)

在《Python FAQ1》一文中,對賦值已經(jīng)講的很清楚了,關(guān)鍵要理解變量與對象的關(guān)系。

12345

a = [1, 2, 3] b = a print(id(a), id(b), sep='\n')139701469405552139701469405552

在Python中,用一個變量給另一個變量賦值,其實(shí)就是給當(dāng)前內(nèi)存中的對象增加一個“標(biāo)簽”而已。

如上例,通過使用內(nèi)置函數(shù) id() ,可以看出 a 和 b 指向內(nèi)存中同一個對象。a is b會返回 True 。

二、淺拷貝(shallow copy)

注意:淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實(shí)例。而對于數(shù)字、字符串以及其它“原子”類型,沒有拷貝一說,產(chǎn)生的都是原對象的引用。

所謂“淺拷貝”,是指創(chuàng)建一個新的對象,其內(nèi)容是原對象中元素的引用。(拷貝組合對象,不拷貝子對象)

常見的淺拷貝有:切片操作、工廠函數(shù)、對象的copy()方法、copy模塊中的copy函數(shù)。

12345678910

a = [1, 2, 3] b = list(a) print(id(a), id(b)) # a和b身份不同140601785066200 140601784764968 for x, y in zip(a, b): # 但它們包含的子對象身份相同... print(id(x), id(y))... 140601911441984 140601911441984140601911442016 140601911442016140601911442048 140601911442048

從上面可以明顯的看出來,a 淺拷貝得到 b,a 和 b 指向內(nèi)存中不同的 list 對象,但它們的元素卻指向相同的 int 對象。這就是淺拷貝!

三、深拷貝(deep copy)

所謂“深拷貝”,是指創(chuàng)建一個新的對象,然后遞歸的拷貝原對象所包含的子對象。深拷貝出來的對象與原對象沒有任何關(guān)聯(lián)。

深拷貝只有一種方式:copy模塊中的deepcopy函數(shù)。

1234567891011

import copy a = [1, 2, 3] b = copy.deepcopy(a) print(id(a), id(b))140601785065840 140601785066200 for x, y in zip(a, b):... print(id(x), id(y))... 140601911441984 140601911441984140601911442016 140601911442016140601911442048 140601911442048

看了上面的例子,有人可能會疑惑:

為什么使用了深拷貝,a和b中元素的id還是一樣呢?

答:這是因?yàn)閷τ诓豢勺儗ο?,?dāng)需要一個新的對象時,python可能會返回已經(jīng)存在的某個類型和值都一致的對象的引用。而且這種機(jī)制并不會影響 a 和 b 的相互獨(dú)立性,因?yàn)楫?dāng)兩個元素指向同一個不可變對象時,對其中一個賦值不會影響另外一個。

我們可以用一個包含可變對象的列表來確切地展示“淺拷貝”與“深拷貝”的區(qū)別:

1234567891011121314151617181920

import copy a = [[1, 2],[5, 6], [8, 9]] b = copy.copy(a) # 淺拷貝得到b c = copy.deepcopy(a) # 深拷貝得到c print(id(a), id(b)) # a 和 b 不同139832578518984 139832578335520 for x, y in zip(a, b): # a 和 b 的子對象相同... print(id(x), id(y))... 139832578622816 139832578622816139832578622672 139832578622672139832578623104 139832578623104 print(id(a), id(c)) # a 和 c 不同139832578518984 139832578622456 for x, y in zip(a, c): # a 和 c 的子對象也不同... print(id(x), id(y))... 139832578622816 139832578621520139832578622672 139832578518912139832578623104 139832578623392

從這個例子中可以清晰地看出淺拷貝與深拷貝地區(qū)別。

總結(jié):

1、賦值:簡單地拷貝對象的引用,兩個對象的id相同。

2、淺拷貝:創(chuàng)建一個新的組合對象,這個新對象與原對象共享內(nèi)存中的子對象。

3、深拷貝:創(chuàng)建一個新的組合對象,同時遞歸地拷貝所有子對象,新的組合對象與原對象沒有任何關(guān)聯(lián)。雖然實(shí)際上會共享不可變的子對象,但不影響它們的相互獨(dú)立性。

淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實(shí)例。而對于數(shù)字、字符串以及其它“原子”類型,沒有拷貝一說,產(chǎn)生的都是原對象的引用。

Python中的賦值,淺拷貝和深拷貝的區(qū)別

賦值(=),就是創(chuàng)建了對象的一個新的引用,修改其中任意一個變量都會影響到另一個。

淺拷貝:創(chuàng)建一個新的對象,但它包含的是對原始對象中包含項(xiàng)的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數(shù),如list();3,copy模塊的copy()函數(shù)}

深拷貝:創(chuàng)建一個新的對象,并且遞歸的復(fù)制它所包含的對象(修改其中一個,另外一個不會改變){copy模塊的deep.deepcopy()函數(shù)}

Python3 & 淺拷貝與深拷貝

在Python中對象的賦值(=)其實(shí)就是對象的引用。即:當(dāng)創(chuàng)建一個對象,把它賦值給另一個變量時,python并沒有拷貝這個對象,只是拷貝了這個對象的引用而已。

Python中對象的拷貝分為:淺拷貝(copy)和深拷貝(deepcopy)。

淺拷貝:拷貝了最外圍的對象本身,內(nèi)部的元素都只是拷貝了一個引用而已。也就是,將原對象在內(nèi)存中引用地址拷貝過來,然后讓新的對象指向這個地址??梢允褂谩?”或列表自帶的copy()函數(shù)(如list.copy()),或使用copy模塊的copy()函數(shù)。

深拷貝:外圍和內(nèi)部元素都進(jìn)行了拷貝對象本身,而不是引用。即把對象復(fù)制一遍,并且該對象中引用的其他對象也同時復(fù)制,完全得到一個新的一模一樣的對象,對新對象里的值進(jìn)行修改不會影響原有對象,新對象和原對象完全分離開。深拷貝只能使用copy模塊中deepcopy()函數(shù),使用前要導(dǎo)入:from copy import deepcopy。

Python中對象分為不可變對象 、可變對象。

不可變對象:一旦創(chuàng)建就不可修改的對象,例如:字符串、元組、數(shù)字

可變對象:可以修改的對象,例如:列表、字典。

其中Python中的切片可以應(yīng)用于:列表、元組、字符串,但不能應(yīng)用于字典。

而深淺拷貝,可應(yīng)用于序列(列表、元組、字符串),也可應(yīng)用于字典。

其中不可變對象,不管是深拷貝還是淺拷貝,地址值在拷貝后的值都是一樣的。

以下以元組(不可變類型)為例

從上述示例可以看出:

不可變對象類型,沒有被拷貝的說法,即便是用深拷貝,查看id的話也是一樣的,如果對其重新賦值,也只是新創(chuàng)建一個對象,替換掉舊的而已。

所以不可變類型,不管是深拷貝還是淺拷貝,地址值和拷貝后的值都是一樣的。

以下以列表(可變類型)為例

第一種方法:使用=號淺拷貝

輸出結(jié)果:

第二種方法:使用copy淺拷貝

輸出結(jié)果:

第三種方法:使用deepcopy深拷貝

輸出結(jié)果:

從上述示例可以看出:

=淺拷貝:值相等,地址相等

copy淺拷貝:值相等,地址不相等

deepcopy深拷貝:值相等,地址不相等

總結(jié):

1,深淺拷貝都是對源對象的復(fù)制,占用不同的內(nèi)存空間。

2,不可變類型的對象,對于深淺拷貝毫無影響,最終的地址值和值都是相等的。

3,可變類型的對象,使用=淺拷貝時, 值相等,地址相等,對新對象里的值進(jìn)行修改同時會影響原有對象;使用copy淺拷貝時值相等,地址不相等;使用deepcopy深拷貝時值相等,地址不相等??梢钥闯鲠槍勺冾愋蚦opy淺拷貝和deepcopy深拷貝,對新對象里的值進(jìn)行修改不會影響原有對象。

名稱欄目:深拷貝函數(shù)python 深淺拷貝實(shí)現(xiàn)方法
當(dāng)前路徑:http://chinadenli.net/article36/dooospg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、企業(yè)網(wǎng)站制作、微信公眾號、品牌網(wǎng)站制作、網(wǎng)站收錄、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計