黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Python中的深拷貝和淺拷貝詳解

系統(tǒng) 2308 0

要說(shuō)清楚Python中的深淺拷貝,需要搞清楚下面一系列概念:
變量-引用-對(duì)象(可變對(duì)象,不可變對(duì)象)-切片-拷貝(淺拷貝,深拷貝)

【變量-對(duì)象-引用】

在Python中一切都是對(duì)象,比如說(shuō):3, 3.14, 'Hello', [1,2,3,4],{'a':1}......

Python中的深拷貝和淺拷貝詳解_第1張圖片

甚至連type其本身都是對(duì)象,type對(duì)象
Python中變量與C/C++/Java中不同,它是指對(duì)象的引用,Python是動(dòng)態(tài)類型,程序運(yùn)行時(shí)候,會(huì)根據(jù)對(duì)象的類型
來(lái)確認(rèn)變量到底是什么類型。

單獨(dú)賦值: 比如說(shuō):

復(fù)制代碼 代碼如下:

>>> a = 3

在運(yùn)行a=3后,變量a變成了對(duì)象3的一個(gè)引用。在內(nèi)部,變量事實(shí)上是到對(duì)象內(nèi)存空間的一個(gè)指針

Python中的深拷貝和淺拷貝詳解_第2張圖片

因?yàn)镻ython的變量不過(guò)是對(duì)象的引用,或指向?qū)ο蟮闹羔?,因此在程序中可以?jīng)常改變變量引用

復(fù)制代碼 代碼如下:

>>> x = 42????? #變量綁定到整型對(duì)象
>>> x = 'Hello' #現(xiàn)在又成了字符串
>>> x = [1,2,3] #現(xiàn)在又成了列表

專業(yè)表述如下:

變量是一個(gè)系統(tǒng)表的元素,擁有指向?qū)ο蟮倪B接的空間
對(duì)象是被分配的一塊內(nèi)存,存儲(chǔ)其所代表的值
引用是自動(dòng)形成的從變量到對(duì)象的指針
特別注意: 類型屬于對(duì)象,不是變量
比如像剛才的a=3, 整數(shù)對(duì)象3包含了兩重信息
1.值為3
2.一個(gè)頭部信息:告訴Pthyon,這是個(gè)整數(shù)對(duì)象[相當(dāng)于一個(gè)指向int的指針]

共享引用: 比如說(shuō):

復(fù)制代碼 代碼如下:

>>> a = 3
>>> b = a

在運(yùn)行賦值語(yǔ)句b = a之后,變量a和變量b指向了同一個(gè)對(duì)象的內(nèi)存空間.

Python中的深拷貝和淺拷貝詳解_第3張圖片

Python中的深拷貝和淺拷貝詳解_第4張圖片

從上圖可以看到,a和b,其id完全一樣,指向同一個(gè)整數(shù)對(duì)象3,或者說(shuō)同一塊內(nèi)存

Python中的深拷貝和淺拷貝詳解_第5張圖片

如果刪掉a后, 不會(huì)影響b

Python中的深拷貝和淺拷貝詳解_第6張圖片

拷貝概念的引入就是針對(duì):可變對(duì)象的共享引用潛在的副作用而提出的.
【可變對(duì)象-不可變對(duì)象】
在Python中不可變對(duì)象指:一旦創(chuàng)建就不可修改的對(duì)象,包括字符串,元祖,數(shù)字
在Python中可變對(duì)象是指:可以修改的對(duì)象,包括:列表、字典
上面說(shuō)的a,b都是整數(shù),整數(shù)是不可變對(duì)象,如果是可變對(duì)象的話,就是另外一回事了。

復(fù)制代碼 代碼如下:

>>> L1 = [2,3,4]????? #L1變量指向的是一個(gè)可變對(duì)象:列表?
>>> L2 = L1?????????? #將L1值賦給L2后,兩者共享引用同一個(gè)列表對(duì)象[1,2,3,4]?
>>> L1[0] = 200?????? #因?yàn)榱斜砜勺?,改變L1中第一個(gè)元素的值?
>>> L1; L2??????????? #改變后,L1,L2同時(shí)改變,因?yàn)閷?duì)象本身值變了?
[200, 3, 4]?
[200, 3, 4]?

如果不想改變列表L2的值,有兩種方法:切片 和 copy模塊
復(fù)制代碼 代碼如下:

>>> L1 = [2,3,4]??
>>> L2 = L1?
>>> id(L1);id(L2)???? #共享引用一個(gè)可變對(duì)象?
45811784L?
45811784L?
>>> L2 = L1[:]??????? #切片操作?
>>> id(L1);id(L2)???? #切片后,對(duì)象就不一樣了?
45811784L?
45806920L?
>>> L1[0] = 200?
>>> L1;L2???????????? #L1發(fā)生改變,L2沒(méi)有變化?
[200, 3, 4]?
[2,?? 3, 4]?

【拷貝】
1. 切片技術(shù)應(yīng)用于所有的序列,包括:列表、字符串、元祖
?? >>>但切片不能應(yīng)用于字典。對(duì)字典只能使用D.copy()方法或D.deepcopy()方法.

Python中的深拷貝和淺拷貝詳解_第7張圖片

2. 深淺拷貝,即可用于序列,也可用于字典

復(fù)制代碼 代碼如下:

?? >>> import copy
?? >>> X = copy.copy(Y)????? #淺拷貝:只拷貝頂級(jí)的對(duì)象,或者說(shuō):父級(jí)對(duì)象
?? >>> X = copy.deepcopy(Y)? #深拷貝:拷貝所有對(duì)象,頂級(jí)對(duì)象及其嵌套對(duì)象?;蛘哒f(shuō):父級(jí)對(duì)象及其子對(duì)象

如果字典只有頂級(jí)對(duì)象:

Python中的深拷貝和淺拷貝詳解_第8張圖片

如果字典中嵌套對(duì)象:

Python中的深拷貝和淺拷貝詳解_第9張圖片

【結(jié)論】

深淺拷貝都是對(duì)源對(duì)象的復(fù)制,占用不同的內(nèi)存空間
如果源對(duì)象只有一級(jí)目錄的話,源做任何改動(dòng),不影響深淺拷貝對(duì)象
如果源對(duì)象不止一級(jí)目錄的話,源做任何改動(dòng),都要影響淺拷貝,但不影響深拷貝
序列對(duì)象的切片其實(shí)是淺拷貝,即只拷貝頂級(jí)的對(duì)象


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論