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

Python列表的深復(fù)制和淺復(fù)制示例詳解

 更新時(shí)間:2021年02月12日 10:34:33   作者:Kepler11  
這篇文章主要給大家介紹了關(guān)于Python列表的深復(fù)制和淺復(fù)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、深復(fù)制與淺復(fù)制

列表是Python中自帶的一種數(shù)據(jù)結(jié)構(gòu),在使用列表時(shí),拷貝操作不可避免,下面簡(jiǎn)單討論一下列表的深復(fù)制(拷貝)與淺復(fù)制

首先看代碼:

l1 = [5, 4, 3, 2, 1]
# 用兩種方法實(shí)現(xiàn)對(duì)列表l1的拷貝
l2 = l1
l3 = l1[:]
print(l1) # [5, 4, 3, 2, 1]
print(l2) # [5, 4, 3, 2, 1]
print(l3) # [5, 4, 3, 2, 1]
 
#修改l1
l1[0] = 9
print(l1) # [9, 4, 3, 2, 1]
print(l2) # [9, 4, 3, 2, 1]
print(l3) # [5, 4, 3, 2, 1]

我們發(fā)現(xiàn)修改l1的第一個(gè)元素后,l2的第一個(gè)元素跟著改變,而l3并沒有發(fā)生變化。Python內(nèi)置函數(shù)id()可以返回元素的地址,那么我們使用這個(gè)函數(shù)來(lái)看一下三個(gè)列表的地址:

print(id(l1)) # 2927957162504
print(id(l2)) # 2927957162504
print(id(l3)) # 2927923243528

從結(jié)果來(lái)看,l1和l2地址是一樣的,也就是說(shuō)l1和l2指向的是同一塊內(nèi)存區(qū)域,顯然,通過(guò) l2 = l1 操作,l1和l2都成了指向同一塊內(nèi)存地址的“指針”,也就是說(shuō)這個(gè)操作是為l1取了一個(gè)別名,也可以說(shuō)l2是l1的一個(gè)引用。用一張圖來(lái)解釋:

那么修改l1也就是在修改l2:

接下來(lái)看一下創(chuàng)建l3的過(guò)程,l3 = l1[:] ,這是將l1進(jìn)行切片,并將切片后的列表拷貝到l3所指向的內(nèi)存區(qū)域,同樣看圖:

也就是說(shuō)l1和l3指向不同的內(nèi)存區(qū)域,那么修改l1并不會(huì)影響到l3:

通俗的來(lái)講,像l2這種,拷貝出來(lái)的對(duì)象和原對(duì)象的地址相同,為淺復(fù)制,像l3這種,分配新的內(nèi)存空間并拷貝原始內(nèi)容的,拷貝出來(lái)的對(duì)象和原對(duì)象的地址不同,為深復(fù)制

二、復(fù)制列表內(nèi)元素的淺復(fù)制

在復(fù)制列表中的所有元素的時(shí)候,進(jìn)行淺復(fù)制

看一個(gè)比較有意思的東西,看代碼:

l1 = [1,2,3,[1,3]]
l2 = l1[:]
l1[3][1] = 9
print(l1) # [1, 2, 3, [1, 9]]
print(l2) # [1, 2, 3, [1, 9]]

按照前面的理解,修改l1某個(gè)元素后,l2應(yīng)該不會(huì)發(fā)生改變,可結(jié)果卻與我們預(yù)想的結(jié)果大相徑庭,于是,我們不得不思考一下l2深復(fù)制到底復(fù)制了什么東西。實(shí)際上列表其實(shí)可以理解為一個(gè)“指針”,l1[3]是一個(gè)列表元素,l2[3]也是一個(gè)列表元素,執(zhí)行以下代碼:

print(id(l2[3])) # 2014816956232
print(id(l1[3])) # 2014816956232

我們發(fā)現(xiàn)l1[3]和l2[3]指向的地址是一樣的,也就是說(shuō)在執(zhí)行 l2 = l1[:] 的時(shí)候,將一個(gè)地址拷貝了,所以修改l1[3]相當(dāng)于修改l2[3],所以才會(huì)出現(xiàn)上述結(jié)果,這更加說(shuō)明了列表其實(shí)就是一個(gè)指向一片內(nèi)存區(qū)域的“指針”。那么我們是不是可以說(shuō)列表l2深復(fù)制l1,但是對(duì)列表中每個(gè)元素進(jìn)行復(fù)制時(shí)進(jìn)行的是淺復(fù)制呢?答案顯而易見。

修改l1[3]中的元素:

三、copy()和deepcopy()

copy模塊可以幫助我們實(shí)現(xiàn)對(duì)象的復(fù)制操作

列舉一下其他的拷貝列表的方式:

l4 = l1 * 1
print(id(l4)) # 2927957916296
l5 = list(l1)
print(id(l5)) # 2927957767816
import copy
l6 = copy.copy(l1)
print(id(l6)) # 2927956854024
l7 = copy.deepcopy(l1)
print(id(l7)) # 2927958503368

我們可以看到,這幾種拷貝方式所得到的的新對(duì)象與原對(duì)象的地址都不相同了,并沒有按照字面意思(copy進(jìn)行淺復(fù)制,deepcopy進(jìn)行深復(fù)制),那么copy()和deepcopy()究竟有什么區(qū)別呢,繼續(xù)看代碼:

list1 = [1,2,3,[1,3]]
list2 = list1[:]
list3 = copy.copy(list1)
list4 = copy.deepcopy(list1)
list1[3][0] = 9
print(list1) # [1, 2, 3, [9, 3]]
print(list2) # [1, 2, 3, [9, 3]]
print(list3) # [1, 2, 3, [9, 3]]
print(list4) # [1, 2, 3, [1, 3]]
print(id(list1[3])) # 2927923172616
print(id(list2[3])) # 2927923172616
print(id(list3[3])) # 2927923172616
print(id(list4[3])) # 2927967190728

可以發(fā)現(xiàn)copy()和前面提到的用 [:] 進(jìn)行拷貝沒有本質(zhì)上的區(qū)別,對(duì)列表中的每個(gè)元素進(jìn)行復(fù)制時(shí)進(jìn)行的是淺拷貝,而deepcopy()在復(fù)制列表中的每個(gè)元素的時(shí)候,進(jìn)行的是深拷貝

總結(jié)

到此這篇關(guān)于Python列表的深復(fù)制和淺復(fù)制的文章就介紹到這了,更多相關(guān)Python列表深復(fù)制和淺復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python字符串基礎(chǔ)操作詳解

    python字符串基礎(chǔ)操作詳解

    這篇文章主要為大家詳細(xì)介紹了python字符串基礎(chǔ)操作,,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 詳解pandas df.iloc[]的典型用法

    詳解pandas df.iloc[]的典型用法

    本文主要介紹了詳解pandas df.iloc[]的典型用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Python configparser模塊常用方法解析

    Python configparser模塊常用方法解析

    這篇文章主要介紹了Python configparser模塊常用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • pytorch搭建模型的五大層次級(jí)別解讀(由淺入深)

    pytorch搭建模型的五大層次級(jí)別解讀(由淺入深)

    這篇文章主要介紹了pytorch搭建模型的五大層次級(jí)別(由淺入深),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 教你從零開始實(shí)現(xiàn)貪吃蛇Python小游戲

    教你從零開始實(shí)現(xiàn)貪吃蛇Python小游戲

    這篇文章主要教你從零開始實(shí)現(xiàn)貪吃蛇Python小游戲,沒有使用pygame庫(kù),附帶源碼和注釋,非常有意思,需要的朋友可以參考下
    2023-03-03
  • OpenCV黑帽運(yùn)算(BLACKHAT)的使用

    OpenCV黑帽運(yùn)算(BLACKHAT)的使用

    本文主要介紹了OpenCV黑帽運(yùn)算(BLACKHAT)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Python+Jmeter實(shí)現(xiàn)自動(dòng)化性能壓測(cè)的流程步驟

    Python+Jmeter實(shí)現(xiàn)自動(dòng)化性能壓測(cè)的流程步驟

    性能測(cè)試是一個(gè)全棧工程師/架構(gòu)師必會(huì)的技能之一,只有學(xué)會(huì)性能測(cè)試,才能根據(jù)得到的測(cè)試報(bào)告進(jìn)行分析,找到系統(tǒng)性能的瓶頸所在,而這也是優(yōu)化架構(gòu)設(shè)計(jì)中重要的依據(jù),本文給大家介紹了Python+Jmeter實(shí)現(xiàn)自動(dòng)化性能壓測(cè)的流程步驟,需要的朋友可以參考下
    2024-05-05
  • Python實(shí)現(xiàn)的文本簡(jiǎn)單可逆加密算法示例

    Python實(shí)現(xiàn)的文本簡(jiǎn)單可逆加密算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的文本簡(jiǎn)單可逆加密算法,結(jié)合完整實(shí)例形式分析了Python自定義加密與解密算法具體實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-05-05
  • python3 循環(huán)讀取excel文件并寫入json操作

    python3 循環(huán)讀取excel文件并寫入json操作

    這篇文章主要介紹了python3 循環(huán)讀取excel文件并寫入json操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Windows 下python3.8環(huán)境安裝教程圖文詳解

    Windows 下python3.8環(huán)境安裝教程圖文詳解

    這篇文章主要介紹了Windows 下python3.8環(huán)境安裝教程圖文詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

芦溪县| 金坛市| 贵港市| 合肥市| 三亚市| 义乌市| 苗栗县| 高密市| 阿坝县| 柳河县| 商城县| 舟曲县| 资兴市| 娱乐| 芜湖县| 峨山| 乌什县| 扎赉特旗| 察隅县| 广平县| 辽源市| 星座| 五大连池市| 根河市| 岢岚县| 武宣县| 桐城市| 疏勒县| 安国市| 海宁市| 尖扎县| 葫芦岛市| 海淀区| 宜昌市| 宁远县| 阿克| 竹溪县| 大埔县| 红桥区| 元谋县| 巴彦淖尔市|