国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

學(xué)習(xí)Python一年,這次終于弄懂了淺拷貝和深拷貝

開發(fā) 前端
Python中對象的賦值其實(shí)就是對象的引用。當(dāng)創(chuàng)建一個(gè)對象,把它賦值給另一個(gè)變量的時(shí)候,Python并沒有拷貝這個(gè)對象,只是拷貝了這個(gè)對象的引用而已。

話說,網(wǎng)上已經(jīng)有很多關(guān)于 Python 淺拷貝和深拷貝的文章了,不過好多文章看起來還是決定似懂非懂,所以決定用自己的理解來寫出這樣一篇文章。

當(dāng)別人一提起Python中的復(fù)制操作,你會不會立馬站起來說:“我會”,于是就有了如下操作:

import copy

x = copy.copy(y) # 淺拷貝我會了
x = copy.deepcopy(y) # 深拷貝我來了

那淺拷貝和深拷貝有什么區(qū)別呢,你能給我講講嗎?

1、從引用vs.拷貝說起

首先,我們要弄清楚什么是對象引用與對象拷貝(復(fù)制)。

對象引用

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

>>> a = 1
>>> b = a
>>> id(a) == id(b)
True
>>> x = [1, 2, 3]
>>> y = [x, 4]
>>> x
[1, 2, 3]
>>> y
[[1, 2, 3], 4]
>>>
>>>> id(x) == id(y)
False
>>> id(x) == id(y[0])
True

如果這個(gè)過程不理解,可以看看下圖:

圖片

當(dāng)我們對 x 列表進(jìn)行操作時(shí),會發(fā)現(xiàn) y 中也發(fā)生了意料之外的事情:

>>> x[1] = 2020
>>> y
[[1, 2020, 3], 4]

由于列表是可變的,修改x這個(gè)列表對象的時(shí)候,也會改變對象 y 中對 x 的引用。

所以當(dāng)我們在原處修改可變對象時(shí) 可能會影響程序中其他地方對相同對象的其他引用,這一點(diǎn)很重要。如果你不想這樣做,就需要明確地告訴 Python 復(fù)制該對象。

對象拷貝

如果你需要拷貝,可以進(jìn)行如下操作:

  • 沒有限制條件的分片表達(dá)式(L[:])
  • 工廠函數(shù)(如list/dir/set)
  • 字典copy方法(X.copy())
  • copy標(biāo)準(zhǔn)庫模塊(import copy)

舉個(gè)例子,假設(shè)有一個(gè)列表L和一個(gè)字典D:

>>> L = [2019, 2020, 2021]
>>> D = {'1':2019, '2':2020, '3':2021}
>>>
>>> A = L[:] # 區(qū)分 A=L 或 A = List(L)
>>> B = D.copy() # 區(qū)分 B=D
>>> A
[2019, 2020, 2021]
>>> B
{'1': 2019, '2': 2020, '3': 2021}

圖片

這樣定義之后,當(dāng)你修改A和B時(shí),會發(fā)現(xiàn)并不會對原來的L跟D產(chǎn)生影響,因?yàn)?,這就是對象的拷貝。

>>> A[1] = 'happy'
>>> B[3] = 'today'
>>> L, D
([2019, 2020, 2021], {'1': 2019, '2': 2020, '3': 2021})
>>> A, B
([2019, 'happy', 2021], {'1': 2019, '2': 2020, '3': 2021, 3: 'today'})

上述對列表和字典的拷貝操作默認(rèn)都為淺拷貝:

  • 制作字典的淺層復(fù)制可以使用dict.copy() 方法
  • 而制作列表的淺層復(fù)制可以通過賦值整個(gè)列表的切片完成,例如,copied_list = original_list[:]。

說到這里,疑問就產(chǎn)生了?什么是淺拷貝?淺拷貝的對應(yīng)深拷貝又該作何解釋?

2、談?wù)劀\拷貝和深拷貝

官方文檔定義:

淺層復(fù)制和深層復(fù)制之間的區(qū)別僅與復(fù)合對象 (即包含其他對象的對象,如列表或類的實(shí)例) 相關(guān):

一個(gè)淺層復(fù)制 會構(gòu)造一個(gè)新的復(fù)合對象,然后(在可能的范圍內(nèi))將原對象中找到的 引用 插入其中。

一個(gè)深層復(fù)制 會構(gòu)造一個(gè)新的復(fù)合對象,然后遞歸地將原始對象中所找到的對象的 副本 插入。

淺拷貝

?淺拷貝:拷貝了最外圍的對象本身,內(nèi)部的元素都只是拷貝了一個(gè)引用而已。也就是,把對象復(fù)制一遍,但是該對象中引用的其他對象我不復(fù)制。

用通俗的話理解就是:你的櫥柜(對象)里裝著一??(籃子)??(雞蛋),然后淺拷貝一下的意思。我只拷貝了最外面的這個(gè)櫥柜,至于里面的內(nèi)部元素(??和??)我并不拷貝。

當(dāng)我們遇到簡單的對象時(shí),用上面的解釋好像很好理解;如果遇到復(fù)合對象,就比如下列代碼:

l1 = [3, [66, 55, 44], (3, 7, 21)]
l2 = list(l1)
l1.append(100)
print('l1:', l1)
print('l2:', l2)
l1[1].remove(55)
l2[1] += [33, 22]
l2[2] += (9, 9, 81)
print('l1:', l1)
print('l2:', l2)

代碼解釋:

  • l2是l1的淺拷貝
  • 把100追加到l1,對l2沒有影響
  • 1內(nèi)部列表l1[1中的55刪除,對l2也產(chǎn)生影響,因?yàn)閘1[1]和l2[1]綁定的是同一個(gè)列表
  • 對可變對象來說,l2[1引用的列表進(jìn)行+=就地修改列表。這次修改導(dǎo)致l1[1]也發(fā)生了改變
  • 對元組來說,+= 運(yùn)算符創(chuàng)建一個(gè)新元組,然后重新綁定給變量 l2[2]。這等同于l2[2] = l2[2] + (10, 11)?,F(xiàn)在,l1 和 l2 中最 后位置上的元組不是同一個(gè)對象

把這段代碼可視化出來如下:

圖片

動手試一試,可以點(diǎn)此處

深拷貝

?深拷貝:外圍和內(nèi)部元素都進(jìn)行了拷貝對象本身,而不是引用。也就是,把對象復(fù)制一遍,并且該對象中引用的其他對象我也復(fù)制。

對比上面的籃子和雞蛋:你的櫥柜(對象)里裝著一??(籃子)??(雞蛋),然后深拷貝一下的意思。把最外面的這個(gè)櫥柜和里面的內(nèi)部元素(??和??)全部拷貝過來。

圖片

from copy import deepcopy
l1 = [3, [66, 55, 44], (3, 7, 21)]
l2 = deepcopy(l1)
l1.append(100)
print('l1:', l1)
print('l2:', l2)
l1[1].remove(55)
l2[1] += [33, 22]
l2[2] += (9, 9, 81)
print('l1:', l1)
print('l2:', l2)

輸出結(jié)果:

圖片

拷貝的特點(diǎn)

  1. 不可變類型的對象(如數(shù)字、字符串、和其他'原子'類型的對象)對于深淺拷貝毫無影響,最終的地址值和值都是相等的。也就是,"obj is copy.copy(obj)" 、"obj is copy.deepcopy(obj)"
  2. 可變類型的對象=淺拷貝:值相等,地址相等copy淺拷貝:值相等,地址不相等deepcopy深拷貝:值相等,地址不相等
  3. 循環(huán)引用的對象如果對象有循環(huán)引用,那么這個(gè)樸素的算法會進(jìn)入無限循環(huán)。deepcopy 函數(shù)會記住已經(jīng)復(fù)制的對象,因此能優(yōu)雅地處理循環(huán)引用。

循環(huán)引用:b 引用 a,然后追加到 a 中;deepcopy 會想辦法復(fù)制 a,而copy會進(jìn)入無限循環(huán)。如下面代碼:

from copy import deepcopy, copy
a = [80, 90]
b = [a, 100]
a.append(b)
print("a:", a)
print("b:", b)

c = deepcopy(a)
print("c:", c)

d = copy(b)
print("d:", d)

輸出結(jié)果:

a: [80, 90, [[...], 100]]
b: [[80, 90, [...]], 100]
c: [80, 90, [[...], 100]]
d: [[80, 90, [[...], 100]], 100]

深淺拷貝的作用

1,減少內(nèi)存的使用2,以后在做數(shù)據(jù)的清洗、修改或者入庫的時(shí)候,對原數(shù)據(jù)進(jìn)行復(fù)制一份,以防數(shù)據(jù)修改之后,找不到原數(shù)據(jù)。3. 可以定制復(fù)制行為,通過實(shí)現(xiàn)__copy()和__deep__()方法來控制。

3、總結(jié)

看完這篇文章后,轉(zhuǎn)身就跟你同桌說:“x同學(xué),聽說你最近在學(xué)Python,你知道淺拷貝和深拷貝嗎?”“不知道,學(xué)得有點(diǎn)暈”“沒事,我來給你講講:”

拷貝其實(shí)在開始學(xué)好幾個(gè)操作語句中,我們就已經(jīng)使用過卻可能不知道的(前3個(gè)),而且淺拷貝是Python的默認(rèn)拷貝方式。拷貝的方法如下:

  1. 可變類型的切片操作:[:]
  2. 工廠函數(shù)(如list/dir/set)
  3. 字典copy方法(X.copy())
  4. 然后就是Python有專門的copy標(biāo)準(zhǔn)庫模塊:包含兩個(gè)方法copy()和deepcopy()

淺拷貝就像是我只拷貝最外圍的對象,對象中引用的其他對象我不復(fù)制。深拷貝就是完整的把對象和對象里的內(nèi)容都拷貝過來??截惖哪康模?/p>

  1. 為了節(jié)省內(nèi)存
  2. 防止數(shù)據(jù)丟失。

后記:深淺拷貝的坑及難以理解的點(diǎn)也只在復(fù)合對象上,簡單對象就是我們平常理解的復(fù)制。而針對非容器類型(如數(shù)字、字符串、和其他'原子'類型的對象)沒有被拷貝一說。

要是你的同桌還是不懂,你就把這篇文章甩給他,讓他好好看看(偷笑)。如果你覺得這篇文章還不錯(cuò),請點(diǎn)個(gè)贊或者收個(gè)藏,點(diǎn)個(gè)關(guān)注更好啦。

責(zé)任編輯:武曉燕 來源: 宇宙之一粟
相關(guān)推薦

2021-09-27 11:07:11

深拷貝淺拷貝內(nèi)存

2022-07-26 08:07:03

Python淺拷貝深拷貝

2017-08-16 13:30:05

Java深拷貝淺拷貝

2021-07-16 12:33:24

Javascript深拷貝淺拷貝

2023-09-22 12:21:33

Python深拷貝淺拷貝

2019-02-25 08:58:16

Python深拷貝淺拷貝

2020-08-03 08:24:26

原型模式拷貝

2018-09-26 14:37:17

JavaScript前端編程語言

2020-06-23 08:41:47

JavaScript開發(fā)技術(shù)

2021-01-08 06:15:09

深拷貝淺拷貝寫時(shí)拷貝

2023-05-17 08:42:46

深拷貝Golang

2021-09-10 07:41:06

Python拷貝Python基礎(chǔ)

2009-05-19 17:28:44

深拷貝淺拷貝clone()

2020-10-12 08:35:22

JavaScript

2024-03-15 15:03:23

2024-04-17 09:01:08

Python深拷貝淺拷貝

2023-05-17 07:36:00

淺拷貝深拷貝對象

2018-05-10 14:20:18

前端JavaScript深拷貝

2022-09-30 15:03:09

C語言深拷貝淺拷貝

2024-02-05 22:56:16

C++拷貝開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

99久久99久久精品免费看蜜桃| 国产美女情趣调教h一区二区| 欧洲大片精品免费永久看nba| 国产在线精品不卡| 亚洲综合小说区| 阿v视频在线| 国产精品人人做人人爽人人添| 国产精品大陆在线观看| 最新中文字幕在线| 欧美日韩亚洲高清| 91视频在线观看| 久久激情视频久久| 亚洲成人免费| av之家在线观看| 91国在线观看| 国产欧美日韩电影| 国产麻豆一区二区三区在线观看| 国产精品一区在线观看你懂的| heyzo视频在线播放| 亚洲大胆人体视频| 亚洲区小说区图片区qvod按摩| 99视频在线免费| 95精品视频在线| 欧日韩不卡在线视频| 99自拍视频在线观看| 亚洲成人aaa| 欧美著名女优| 亚洲一区二区三区四区在线观看 | 欧美亚洲国产日韩2020| 大香一本蕉伊线亚洲网| 欧美精品丝袜久久久中文字幕| 久久亚洲人体| 久久天天躁狠狠躁夜夜爽蜜月| 少妇激情av一区二区三区| 国产日韩精品一区二区浪潮av| 中国老女人av| 夜久久久久久| 欧美亚洲免费高清在线观看| 视频一区国产视频| 国产剧情久久久久久| 欧美成人精品影院| 综合精品久久| 人与动性xxxxx免费视频| 亚洲图片你懂的| 日韩成人综合网| 久久久久久久久国产精品| 亚洲理论在线| 黄色视屏网站在线免费观看| 久久这里有精品| 国内精品视频666| 日韩精品电影| 日本24小时在线高清视频| 亚洲欧洲另类国产综合| 图片区小说区区亚洲五月| 樱花草国产18久久久久| 午夜久久中文| 日韩免费av一区二区三区| 色哟哟国产精品免费观看| 松下纱荣子在线观看| 青青草精品视频在线| 欧美乱大交xxxxx另类电影| 国产一区二区三区免费观看 | 精品影视av免费| av片在线观看永久免费| 国产对白在线播放| 午夜精品久久久久久久99热浪潮| 亚洲色图欧美偷拍| 久久国产精品第一页| 美女扒开腿让男人桶爽久久软| 97av中文字幕| 国产精品扒开腿做爽爽爽男男| 欧美日韩一区成人| 91天堂素人约啪| 亚洲国产尤物| 日本我和搜子同居的日子高清在线 | 蜜桃传媒视频麻豆一区| 精品呦交小u女在线| 久久久综合网站| 国产欧美高清在线| 亚洲曰韩产成在线| 国产精品一线| 成人在线播放免费观看| 嫩草视频在线观看| 欧美亚洲另类视频| 亚洲成av人影院在线观看| 久久最新视频| 精品视频网站| 99只有精品| 91色在线看| 桃花色综合影院| 欧美一级免费播放| 亚洲草草视频| 久久精品五月婷婷| 51精品国产黑色丝袜高跟鞋 | 少妇激情av一区二区三区| 精品无码久久久久久久动漫| 青草成人免费视频| 久久深夜福利免费观看| 成人免费视频在线观看| 狠狠色丁香久久婷婷综合_中| 国产成人a视频高清在线观看| 黄色18在线观看| 蜜桃成人365av| 三上悠亚一区二区三区| 国产主播中文字幕| 日韩精品你懂的| 正在播放精油久久| 伊人狠狠色丁香综合尤物| 久久精品一二三区| 成人妇女淫片aaaa视频| 91久久久久久久久久| 国产精品av免费在线观看| 精品自拍视频在线观看| 欧美成人午夜免费视在线看片| 日韩av资源在线播放| 精品免费在线视频| 日本乱码高清不卡字幕| 狠狠久久亚洲欧美| 从欧美一区二区三区| 国产一区二区三区四区五区美女| 一区二区三区在线视频播放| 成人羞羞网站入口免费| 超碰地址久久| 国产精品一区三区在线观看| 日韩高清在线观看一区二区| 日韩精品成人| 国产精品日本一区二区不卡视频| 日韩在线观看一区二区三区| 丁香高清在线观看完整电影视频| 国产剧情av在线| 国产日韩欧美精品在线观看| 91免费观看| 亚洲黄色一区二区三区| 亚洲自啪免费| 成人午夜精品在线| 狠久久av成人天堂| 美国av一区二区| 久久综合色鬼综合色| 99国产精品久| 亚洲一区二区免费视频| 亚洲精品电影网| 欧美一级一区二区| 欧美精品成人在线| 亚洲综合成人婷婷小说| 精品人妻人人做人人爽| 视频在线观看免费高清| 乱人伦中文视频在线| 91亚洲精品视频在线观看| 不卡在线一区二区| 激情五月婷婷综合网| 亚洲品质自拍视频网站| 在线观看国产精品91| 国产成人拍精品视频午夜网站| 四虎影院一区二区三区 | 国产一区二区三区天码| 老司机一区二区三区| 欧美国产欧美综合| 亚洲v精品v日韩v欧美v专区| 亚洲精品在线91| 欧美日韩一区综合| 日韩日韩日韩日韩| 中文成人在线| 黄色小说综合网站| 欧美老肥妇做.爰bbww| 欧美成人四级hd版| 黄色录像特级片| 成人一区二区三| 色偷偷偷在线视频播放| 欧美激情1区| 欧美色图在线视频| 91老司机在线| 国产一区二区三区福利| 高潮按摩久久久久久av免费| 99re视频精品| 久久久国产精品视频| 懂色av一区二区三区在线播放| 99视频高清| aaa大片在线观看| 免费在线亚洲| 亚洲第一网中文字幕| 五月天婷亚洲天综合网鲁鲁鲁| 青青草手机在线| 第一社区sis001原创亚洲| 久久综合网色—综合色88| 亚洲第一中文字幕| 免费不卡亚洲欧美| av今日在线| 国模娜娜一区二区三区| 欧美午夜精品免费| 日韩欧美99| а√天堂资源国产精品| 国产精品福利一区二区| 日韩中文在线中文网在线观看| 国产精品露脸av在线| 美乳中文字幕| 国产欧美久久一区二区三区| 亚洲精品视频在线观看免费| 国产激情久久久| 久久亚洲资源| 久久久久久久一区|