日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python淺拷貝和深度拷貝

系統(tǒng) 1754 0

通過(guò)代碼和結(jié)果來(lái)理解淺拷貝和深度拷貝,先來(lái)看看python中有那些常見(jiàn)的淺拷貝方法:

1.使用數(shù)據(jù)類(lèi)型本身的構(gòu)造器:

            
              l1 = [1,2,3]
l2 = list(l1)

l1 == l2 #True
l1 is l2 #False

#l2就是l1的淺拷貝,set、dict與上面的淺拷貝一致


t1 = (1,2,3)
t2 = tuple(t1)

t1 == t2 #True
t1 is t2 #True

#由于tuple不可變,tuple返回一個(gè)指向相同元組的引用,與list、set、dict不一樣


            
          

2.通過(guò)切片操作符‘:’完成淺拷貝:

            
              l1 = [1, 2, 3]
l2 = l1[:]

l1 == l2 #True

l1 is l2 #False

            
          

3.python中提供的函數(shù)copy.copy(),適用于任何數(shù)據(jù)類(lèi)型:

            
              import copy
l1 = [1, 2, 3]
l2 = copy.copy(l1)

l1 == l2 #True
l1 is l2 #False
            
          

淺拷貝,是指重新分配一塊內(nèi)存,創(chuàng)建一個(gè)新對(duì)象,里面的元素是原對(duì)象中子對(duì)象的引用。如果元素可變(list、set、dict),淺拷貝會(huì)帶來(lái)一些副作用。如果元素不可變(Number、String、Tuple),就沒(méi)有這些副作用。

            
              l1 = [[1, 2], (30, 40)]
l2 = list(l1)
l1.append(100)
l1[0].append(3)

l1
[[1, 2, 3], (30, 40), 100]

l2
[[1, 2, 3], (30, 40)]

l1[1] += (50, 60)
l1
[[1, 2, 3], (30, 40, 50, 60), 100]

l2
[[1, 2, 3], (30, 40)]

            
          

根據(jù)以上代碼,初始化了一個(gè)列表l1,里面的元素是一個(gè)列表和一個(gè)元組;,l2是l1的淺拷貝,l2中的元素和l1指向同一個(gè)列表和元組對(duì)象。

  1. 當(dāng)l1.append(100),新增元素100。這個(gè)操作不會(huì)對(duì)l2產(chǎn)生任何影響,因?yàn)閘2和l1作為整體是兩個(gè)不同的對(duì)象,并不共享內(nèi)存地址。
  2. 執(zhí)行l(wèi)1[0].append(3),對(duì)l1的列表新增元素3。由于l2是l1的淺拷貝,l2的第一個(gè)元素和l1中的第一個(gè)元素,共同指向同一個(gè)列表,因此l2中的第一個(gè)列表也會(huì)相對(duì)應(yīng)的新增元素3。l2也跟著發(fā)生改變。
  3. 操作l1[1] += (50,60),因?yàn)樵媸遣豢勺兊模@里表示對(duì)l1中的元組拼接,實(shí)際上是重新創(chuàng)建了一個(gè)新元組作為l1中的第二個(gè)元素,而l2中沒(méi)有引用新元組,l2并不受影響。

通過(guò)以上代碼,可以很清楚的看到使用淺拷貝的副作用。

總結(jié)下,如果集合中有l(wèi)ist、set、dict(可變類(lèi)型)任意一個(gè),慎重使用淺拷貝;如果集合中元素只有Number、String、Tuple(不可變?cè)兀褂脺\拷貝,就沒(méi)有副作用。

要避免這種副作用,完整的拷貝一個(gè)對(duì)象,就得使用深度拷貝。是指重新分配一塊內(nèi)存,創(chuàng)建一個(gè)新對(duì)象,并且將原對(duì)象中的元素,以遞歸的方式,通過(guò)創(chuàng)建新的子對(duì)象拷貝到新對(duì)象中。因此,新對(duì)象和原對(duì)象沒(méi)有任何關(guān)聯(lián)。

python中以copy.deepcopy()來(lái)實(shí)現(xiàn)對(duì)象的深度拷貝。

            
              import copy
l1 = [[1, 2], (30, 40)]
l2 = copy.deepcopy(l1)
l1.append(100)
l1[0].append(3)

l1
[[1, 2, 3], (30, 40), 100]

l2 
[[1, 2], (30, 40)]
            
          

?


更多文章、技術(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ì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 斗六市| 甘孜| 高邮市| 广丰县| 三亚市| 英吉沙县| 清丰县| 钟山县| 苍南县| 阳朔县| 安乡县| 扬中市| 平阳县| 海盐县| 西充县| 万安县| 江油市| 当阳市| 佛学| 利津县| 阿图什市| 井研县| 微山县| 弥渡县| 安泽县| 锡林浩特市| 丰都县| 萝北县| 古浪县| 岳普湖县| 诸暨市| 南康市| 镇沅| 基隆市| 绥阳县| 舒城县| 镶黄旗| 佳木斯市| 郑州市| 桐城市| 禹州市|