這篇文章給大家分享的是有關(guān)Python的賦值、深拷貝與淺拷貝有哪些區(qū)別的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、拜城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為拜城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。在python中,給一個(gè)對(duì)象賦值,實(shí)際上就是對(duì)象對(duì)內(nèi)存空間存儲(chǔ)的值的引用。當(dāng)我們把對(duì)象賦值給另一個(gè)變量的時(shí)候,這個(gè)變量并沒有拷貝這個(gè)對(duì)象,而只是拷貝了這個(gè)對(duì)象的引用而已。
一般情況下我們會(huì)通過三種方法來實(shí)現(xiàn)拷貝對(duì)象的引用。
直接賦值,默認(rèn)淺拷貝傳遞對(duì)象的引用而已,原始列表改變,被賦值的變量也會(huì)做相同的改變。其實(shí)就是對(duì)‘對(duì)象'的引用
示例:
>>> list_demo = [2, 4, 6] >>> a = list_demo >>> print(a) [2, 4, 6] >>> id(list_demo) 65006808 >>> id(a) 65006808 >>> list_demo.append(8) >>> print(list_demo) [2, 4, 6, 8] >>> print(a) [2, 4, 6, 8] >>> id(list_demo) 65006808 >>> id(a) 65006808 >>>
通過 id() 函數(shù)我們可以得出,變量 list_demo 與 a 指向的都是同一個(gè)內(nèi)存空間地址,當(dāng)被賦值的 list_demo改變,被賦值的 a 同樣會(huì)做相同的改變。這種現(xiàn)象普遍存在于 Python 之中,這種賦值的方式實(shí)現(xiàn)了 “假裝” 拷貝,真實(shí)的情況還是兩個(gè)變量和同一個(gè)對(duì)象之間的引用關(guān)系。
import copy 模塊的 copy.copy() 方法,該方法只拷貝父對(duì)象,沒有拷貝子對(duì)象。且淺拷貝是創(chuàng)建一塊新的內(nèi)存空間,但是內(nèi)存空間內(nèi)的元素的地址均是父對(duì)象元素的地址的拷貝。所以當(dāng)父對(duì)象內(nèi)部的子對(duì)象發(fā)生改變時(shí),拷貝對(duì)象的內(nèi)部的子對(duì)象也會(huì)跟著改變。
示例:
>>> list_demo1 = [2, 4, 6, [8, 10]] >>> a = list_demo1 >>> print(list_demo1) [2, 4, 6, [8, 10]] >>> print(a) [2, 4, 6, [8, 10]] >>> >>> >>> import copy >>> b = copy.copy(list_demo1) >>> id(list_demo1) 65103472 >>> id(b) 6011200 >>> list_demo1.append(12) >>> print(list_demo1) [2, 4, 6, [8, 10], 12] >>> list_demo1[3] [8, 10] >>> >>> >>> >>> list_demo1[3].append('hello') >>> print(list_demo1) [2, 4, 6, [8, 10, 'hello'], 12] >>> print(b) [2, 4, 6, [8, 10, 'hello']] >>> list_demo1[3] [8, 10, 'hello'] >>> b[3] [8, 10, 'hello'] >>> >>> >>> >>> id(list_demo1) 65103472 >>> id(b) 6011200 >>> id(list_demo1[3]) 64679128 >>> id(b[3]) 64679128 >>>
從上述代碼可以看出,在執(zhí)行淺拷貝的時(shí)候,淺拷貝實(shí)際上只拷貝引用,不拷貝內(nèi)容。同時(shí),淺拷貝會(huì)針對(duì)父對(duì)象的子對(duì)象進(jìn)行判斷,當(dāng)父對(duì)象的子對(duì)象發(fā)生改變時(shí),拷貝對(duì)象內(nèi)的子對(duì)象同時(shí)也跟著改變。
import copy 模塊的 copy.deepcopy() 方法,深拷貝與淺拷貝相反,就是徹徹底底的拷貝,完全的拷貝了父對(duì)象及子對(duì)象,同時(shí)指向一個(gè)新的內(nèi)存空間地址。此時(shí),雖然源對(duì)象與拷貝對(duì)象的內(nèi)容是一樣的,但是不管針對(duì)誰進(jìn)行改動(dòng),另一個(gè)是絲毫不會(huì)受到影響的。
>>> list_demo2 = [2,3,4]
>>> c= copy.deepcopy(list_demo2)
>>> print(list_demo2)
[2, 3, 4]
>>> print(c)
[2, 3, 4]
>>> id(list_demo2)
6011440
>>> id(c)
6012440
>>> list_demo2.append(['a','b'])
>>> c.append([5,6])
>>> print(list_demo2)
[2, 3, 4, ['a', 'b']]
>>> print(c)
[2, 3, 4, [5, 6]]
>>> list_demo2[3].append('c')
>>> c[3].append(7)
>>> print(list_demo2)
[2, 3, 4, ['a', 'b', 'c']]
>>> print(c)
[2, 3, 4, [5, 6, 7]]
>>>
從上述代碼示例可以看出 list_demo2 與 c 相互獨(dú)立,無論 list_demo2 與 c本身進(jìn)行了修改,或者各自的子對(duì)象進(jìn)行了修改 都沒有互相影響。
總結(jié)
賦值的本質(zhì)就是將一個(gè)對(duì)象的內(nèi)存空間地址賦值給一個(gè)變量,讓變量指向該內(nèi)存空間地址。
淺拷貝是拷貝了源對(duì)象的引用,并創(chuàng)建了一個(gè)新的內(nèi)存空間地址。但是引用的對(duì)象的子對(duì)象的地址仍然是源對(duì)象的,所以當(dāng)源對(duì)象的子對(duì)象發(fā)生改變時(shí),拷貝對(duì)象內(nèi)的子對(duì)象同時(shí)也跟著改變。
深拷貝就是徹底的拷貝,完全的拷貝了父對(duì)象及子對(duì)象,同時(shí)指向一個(gè)新的內(nèi)存空間地址。源對(duì)象與拷貝對(duì)象之間的修改互不影響。
感謝各位的閱讀!關(guān)于“Python的賦值、深拷貝與淺拷貝有哪些區(qū)別”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章題目:Python的賦值、深拷貝與淺拷貝有哪些區(qū)別-創(chuàng)新互聯(lián)
瀏覽地址:http://aaarwkj.com/article34/ccdcse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、網(wǎng)站建設(shè)、企業(yè)建站、企業(yè)網(wǎng)站制作、服務(wù)器托管、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容