最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python深拷貝與淺拷貝用法實(shí)例分析

 更新時(shí)間:2019年05月05日 12:01:20   作者:xuezhangjun  
這篇文章主要介紹了Python深拷貝與淺拷貝用法,結(jié)合實(shí)例形式分析了Python對(duì)象的復(fù)制、深拷貝、淺拷貝等操作原理、用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python深拷貝與淺拷貝用法。分享給大家供大家參考,具體如下:

1、對(duì)象的賦值

對(duì)象的賦值實(shí)際上是對(duì)象之間的引用:當(dāng)創(chuàng)建一個(gè)對(duì)象,然后將這個(gè)對(duì)象賦值給另外一個(gè)變量的時(shí)候,python并沒有拷貝這個(gè)對(duì)象,而只是拷貝了這個(gè)對(duì)象的引用。

當(dāng)對(duì)對(duì)象做賦值或者是參數(shù)傳遞或者作為返回值的時(shí)候,總是傳遞原始對(duì)象的引用,而不是一個(gè)副本。如下所示:

在python中將一個(gè)變量賦值給另一個(gè)變量,傳遞的是引用.無(wú)論是a的內(nèi)層變化還是外層變化,b都會(huì)發(fā)生同樣的變化.因?yàn)椋夂停嶂赶蛄送粋€(gè)引用.類似于c語(yǔ)言中的同一片內(nèi)存地址.

#coding=utf-8
a = [1,2,3,['a','b','c']]
b = a
print('*'*50)
print('--- b = a ---')
print('a = %s'%a)
print('b = %s'%b)
a.append(4)
print('--- 外層a增加了元素4 ---')
print('a = %s'%a)
print('b = %s'%b)
print('--- 內(nèi)層增加了元素"d" ---')
a[3].append('d')
print('a = %s'%a)
print('b = %s'%b)

運(yùn)行結(jié)果:

**************************************************
--- b = a ---
a = [1, 2, 3, ['a', 'b', 'c']]
b = [1, 2, 3, ['a', 'b', 'c']]
--- 外層a增加了元素4 ---
a = [1, 2, 3, ['a', 'b', 'c'], 4]
b = [1, 2, 3, ['a', 'b', 'c'], 4]
--- 內(nèi)層增加了元素'd' ---
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
b = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]

2、對(duì)象的復(fù)制

當(dāng)你想修改一個(gè)對(duì)象,而且讓原始的對(duì)象不受影響的時(shí)候,那么就需要使用到對(duì)象的復(fù)制,對(duì)象的復(fù)制可以通過(guò)三種方法實(shí)現(xiàn):

a、 使用切片操作進(jìn)行拷貝 - -slice operation

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

b、 使用工廠函數(shù)進(jìn)行拷貝,list / dir / set - -factoryfunction

c、 copy.copy()–use copymodule

在復(fù)制的時(shí)候,使用的是淺拷貝,復(fù)制了對(duì)象,但是對(duì)象中的元素,依然使用引用。

如下所示:

a = [1,2,3,['a','b','c']]

#coding=utf-8
import copy
#1.切片操作
print('--- 切片操作?。?)
b = a[:]
print('a = %s\tid(a) = %s'%(a,id(a)))
print('b = %s\tid(b) = %s'%(b,id(b)))
#2.使用工廠函數(shù)
print('--- 使用工廠函數(shù)?。?)
c = list(a)
print('a = %s\tid(a) = %s'%(a,id(a)))
print('c = %s\tid(c) = %s'%(c,id(c)))
#3.copy.copy()
print('--- copy.copy()?。?)
d = copy.copy(a)
print('a = %s\tid(a) = %s'%(a,id(a)))
print('d = %s\tid(d) = %s'%(d,id(d)))

運(yùn)行結(jié)果:

--- 切片操作?。?br /> a = [1, 2, 3, ['a', 'b', 'c']]  id(a) = 140676047022088
b = [1, 2, 3, ['a', 'b', 'c']]  id(b) = 140676047021320
--- 使用工廠函數(shù)?。?br /> a = [1, 2, 3, ['a', 'b', 'c']]  id(a) = 140676047022088
c = [1, 2, 3, ['a', 'b', 'c']]  id(c) = 140676047101640
--- copy.copy() ---
a = [1, 2, 3, ['a', 'b', 'c']]  id(a) = 140436217635720
d = [1, 2, 3, ['a', 'b', 'c']]  id(d) = 140436217656904

在使用淺拷貝的時(shí)候,發(fā)現(xiàn)引用的id都是相同的,但是字符串的id卻發(fā)生了變化,是因?yàn)樵趐ython中,字符串是不可變的,從而在每次進(jìn)行修改的時(shí)候,都是新建一個(gè)對(duì)象,從而引用發(fā)生了變化.

在不可變類型中,數(shù)字和字符串都是不可變類型,從而在每次修改的時(shí)候,都是新創(chuàng)建一個(gè)對(duì)象。

3、模塊

核心模塊:copy

淺拷貝和深拷貝的操作都可以在copy模塊中找到,其實(shí)copy模塊中只有兩個(gè)函數(shù)可用,copy()進(jìn)行淺拷貝操作,而deepcopy()進(jìn)行深拷貝操作.

如下所示:

#coding=utf-8
import copy
a = [1,2,3,['a','b','c']]
#淺拷貝拷貝的是外層即頂級(jí)對(duì)象,對(duì)于內(nèi)層只拷貝引用
#所以在a的外層增加了元素,而c并沒有變化.而在a的內(nèi)層增加元素后,c發(fā)生了同樣的變化.(回顧b=a)
print('*'*50)
print('--- c = copy.copy(a)---')
c = copy.copy(a)
print('a = %s'%a)
print('c = %s'%c)
a.append(4)
print('---外層a增加了元素4---')
print('a = %s'%a)
print('c = %s'%c)
print('---內(nèi)層增加了元素"d"---')
a[3].append('d')
print('a = %s'%a)
print('c = %s'%c)
#深拷貝會(huì)遞歸的拷貝所有內(nèi)容,將所有的內(nèi)容都獨(dú)自拷貝了一份.
#故而,無(wú)論a的外層還是內(nèi)層發(fā)生變化,都不會(huì)影響到d.
print('*'*50)
print('--- d = copy.deepcopy(a) ---')
d = copy.deepcopy(a)
print('a = %s'%a)
print('d = %s'%d)
a.append(5)
print('---外層a增加了元素5---')
print('a = %s'%a)
print('d = %s'%d)
print('---內(nèi)層增加了元素"e"---')
a[3].append('e')
print('a = %s'%a)
print('d = %s'%d)

運(yùn)行如下:

**************************************************
--- c = copy.copy(a)---
a = [1, 2, 3, ['a', 'b', 'c']]
c = [1, 2, 3, ['a', 'b', 'c']]
---外層a增加了元素4---
a = [1, 2, 3, ['a', 'b', 'c'], 4]
c = [1, 2, 3, ['a', 'b', 'c']]
---內(nèi)層增加了元素"d"---
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
c = [1, 2, 3, ['a', 'b', 'c', 'd']]
**************************************************
--- d = copy.deepcopy(a) ---
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
d = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
---外層a增加了元素5---
a = [1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
d = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]
---內(nèi)層增加了元素"e"---
a = [1, 2, 3, ['a', 'b', 'c', 'd', 'e'], 4, 5]
d = [1, 2, 3, ['a', 'b', 'c', 'd'], 4]

4、拷貝的警告

第一:非容器類型(比如數(shù)字,字符串和其他原子類型的對(duì)象,例如代碼,類型和xrange對(duì)象等)沒有拷貝一說(shuō),淺拷貝是完全用切片操作來(lái)完成的。

第二:如果元組變量只包含原子類型對(duì)象,那么深拷貝將不會(huì)進(jìn)行。

#coding=utf-8
import copy
a = (1,2,3)
print('*'*50)
print('--- c = copy.copy(a)---')
c = copy.copy(a)
print(a,id(a))
print(c,id(c))
print('*'*50)
print('--- d = copy.deepcopy(a) ---')
d = copy.deepcopy(a)
print(a,id(a))
print(d,id(c))

運(yùn)行如下:

**************************************************
--- c = copy.copy(a)---
(1, 2, 3) 140394676674992
(1, 2, 3) 140394676674992
**************************************************
--- d = copy.deepcopy(a) ---
(1, 2, 3) 140394676674992
(1, 2, 3) 140394676674992

可見:

對(duì)于可變類型來(lái)說(shuō),深拷貝和淺拷貝是不同的.

而對(duì)于不可變類型來(lái)說(shuō),深拷貝和淺拷貝的結(jié)果相同!

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理基本操作之Seq2seq的用法

    Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理基本操作之Seq2seq的用法

    Seq2Seq模型是輸出的長(zhǎng)度不確定時(shí)采用的模型,這種情況一般是在機(jī)器翻譯的任務(wù)中出現(xiàn),將一句中文翻譯成英文,那么這句英文的長(zhǎng)度有可能會(huì)比中文短,也有可能會(huì)比中文長(zhǎng),所以輸出的長(zhǎng)度就不確定了
    2021-10-10
  • 利用python實(shí)現(xiàn)對(duì)web服務(wù)器的目錄探測(cè)的方法

    利用python實(shí)現(xiàn)對(duì)web服務(wù)器的目錄探測(cè)的方法

    這篇文章主要介紹了利用python實(shí)現(xiàn)對(duì)web服務(wù)器的目錄探測(cè)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • python接口自動(dòng)化測(cè)試之接口數(shù)據(jù)依賴的實(shí)現(xiàn)方法

    python接口自動(dòng)化測(cè)試之接口數(shù)據(jù)依賴的實(shí)現(xiàn)方法

    這篇文章主要介紹了python接口自動(dòng)化測(cè)試之接口數(shù)據(jù)依賴的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • python協(xié)程之動(dòng)態(tài)添加任務(wù)的方法

    python協(xié)程之動(dòng)態(tài)添加任務(wù)的方法

    今天小編就為大家分享一篇python協(xié)程之動(dòng)態(tài)添加任務(wù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • PyQT5 實(shí)現(xiàn)快捷鍵復(fù)制表格數(shù)據(jù)的方法示例

    PyQT5 實(shí)現(xiàn)快捷鍵復(fù)制表格數(shù)據(jù)的方法示例

    這篇文章主要介紹了PyQT5 實(shí)現(xiàn)快捷鍵復(fù)制表格數(shù)據(jù)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • python json load json 數(shù)據(jù)后出現(xiàn)亂序的解決方案

    python json load json 數(shù)據(jù)后出現(xiàn)亂序的解決方案

    今天小編就為大家分享一篇python json load json 數(shù)據(jù)后出現(xiàn)亂序的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python中的默認(rèn)參數(shù)實(shí)例分析

    Python中的默認(rèn)參數(shù)實(shí)例分析

    這篇文章主要介紹了Python中的默認(rèn)參數(shù)實(shí)例分析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python獲取Redis所有Key以及內(nèi)容的方法

    Python獲取Redis所有Key以及內(nèi)容的方法

    今天小編就為大家分享一篇Python獲取Redis所有Key以及內(nèi)容的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Python如何使用PIL Image制作GIF圖片

    Python如何使用PIL Image制作GIF圖片

    這篇文章主要介紹了Python如何使用PIL Image制作GIF圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • PyGame實(shí)現(xiàn)初始化導(dǎo)入所有模塊方法詳解

    PyGame實(shí)現(xiàn)初始化導(dǎo)入所有模塊方法詳解

    pygame安裝是為了開發(fā)小游戲,在下新手在經(jīng)過(guò)許多嘗試后,為大家避雷,給大家分享一個(gè)簡(jiǎn)單有效的方法,下面這篇文章主要給大家介紹了關(guān)于Python中Pygame的詳細(xì)安裝過(guò)程的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評(píng)論

浦县| 锡林郭勒盟| 义乌市| 历史| 长葛市| 吐鲁番市| 抚松县| 雅安市| 察隅县| 福鼎市| 克什克腾旗| 丽江市| 舟曲县| 吉木萨尔县| 荥经县| 临泉县| 化隆| 阿克苏市| 始兴县| 沿河| 壶关县| 弋阳县| 广宗县| 阳新县| 兰坪| 卫辉市| 惠水县| 朝阳区| 武穴市| 轮台县| 盐城市| 漯河市| 庆城县| 鹤山市| 五莲县| 玉溪市| 惠东县| 巨野县| 卢氏县| 吉安县| 哈尔滨市|