国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

問題解析:Python中的變量復(fù)制備份,為什么沒有達(dá)到效果?

0
分享至

背景

在運(yùn)用Python進(jìn)行開發(fā)代碼過程中,會(huì)遇到變量復(fù)制備份的場(chǎng)景,但并沒有得到預(yù)期的結(jié)果,例如下面的例子:

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

listb = lista.copy()

lista[2].append(4)

print(lista) # ['a', 'b', [1, 2, 3, 4]]

print(listb) # ['a', 'b', [1, 2, 3, 4]]

代碼本意是將lista復(fù)制給listb做個(gè)備份,再修改liasta,但是修改后發(fā)現(xiàn)listb也一并被修改了,沒有達(dá)到備份的效果,這個(gè)是什么原因呢?

存儲(chǔ)方式

首先了解一下Python的變量在內(nèi)存中的存儲(chǔ)方式。在基本數(shù)據(jù)類型中(包括set、list(tuple, str)、dict)都是采用引用的方式。

也就是說,每個(gè)變量都存儲(chǔ)的是這個(gè)變量的地址,而不是值本身,就算更復(fù)雜的嵌套結(jié)構(gòu),也是存儲(chǔ)是每個(gè)元素的地址而已,用一幅圖來表示。

如上圖所示,用戶看到的是 lista的4個(gè)元素值,但是內(nèi)存中保存的卻是4個(gè)元素地址。

當(dāng)元素是列表時(shí),第一層保存的是列表的地址,第二層保存的是列表元素的地址,第三層才是列表的值。當(dāng)元素是字典的時(shí)候,與列表類似。

列表的增刪改

在明白了變量存儲(chǔ)方式后,繼續(xù)看下內(nèi)存下的增刪改是怎么變化的。

列表修改已有值

新增一個(gè)內(nèi)存塊,再將引用的地址修改為新內(nèi)存塊的地址。

列表新增一個(gè)值

新增一個(gè)內(nèi)存塊,新增一個(gè)地址引用。

列表整體重新賦值

刪除變量地址和引用的值,新增地址和引用值的內(nèi)存塊。

copy與deepcopy的區(qū)別

基于以上的理解,再來看兩種copy的區(qū)別就會(huì)更容易理解了,首先記住一個(gè)原則:

copy:不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),淺拷貝都只會(huì)copy一層。

deepcopy:將整個(gè)變量?jī)?nèi)存全部復(fù)制一遍,新變量與原變量沒有任何關(guān)系。

舉個(gè)例子來驗(yàn)證一下上面的結(jié)論:有如下的一段代碼,最終的4個(gè)列表值是多少?

注意:引用deepcopy需要導(dǎo)入copy庫(kù)。

import copy

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

b = a

c = copy.copy(a)

d = copy.deepcopy(a)

a.append(5)

a[1] = 20

a[4].append('c')

del a[0]

print(a)

print(b)

print(c)

print(d)

列表b

表示b也引用的a的地址,兩者引用的內(nèi)存地址是一樣的。因此b和a的關(guān)系是緊密相連的,一模一樣??梢酝ㄟ^ id(a) 和id(b)比較,兩者是一樣的。

列表c

由于c是淺拷貝的a列表,因此只copy了第一層,也就是地址層。

所以,當(dāng)a.append(5)時(shí),新增了一個(gè)內(nèi)存塊,但是c只有前5個(gè)內(nèi)存塊,因此c沒有變化。

繼續(xù)a修改了a[1],然而這個(gè)值是屬于第一層,已經(jīng)copy給了c,因此c也沒有變化。

繼續(xù)a修改了子列表,這個(gè)時(shí)候a復(fù)制給c的只是列表的地址,且a中的子列表地址和c中的子列表地址是指向同一個(gè)地方的,因此修改了a中子列表,c中的子列表也會(huì)相應(yīng)的改變。

最后刪除a[0],與修改a[1]一致,與c無關(guān)??梢杂脠D再說明一下。

列表d

由于d是深拷貝的a列表,因此d是將a的地址和值一并復(fù)制過來,與a沒有半點(diǎn)關(guān)系,也就是說d和a是兩個(gè)完全獨(dú)立的內(nèi)存塊,沒有任何交集。因此,后面a的任意修改都與d無關(guān),用圖表示如下。

因此,程序運(yùn)行出來后的結(jié)果就是:

a:[20,3,4,['a','b','c'],5]

b:[20,3,4,['a','b','c'],5]

c:[1,2,3,4,['a','b','c']]

d:[1,2,3,4,['a','b']]

總結(jié)

綜上,我們?cè)谑褂胏opy的時(shí)候,一定要記?。篶opy只是拷貝了第一層,而deepcopy才是拷貝的全部數(shù)據(jù)。

因此就不難發(fā)現(xiàn),文章背景中的代碼使用備份功能時(shí),備份列表需要使用deepcopy,而不是簡(jiǎn)單的copy。

最后:在我的V :atstudy-js,可以費(fèi)領(lǐng)取一份10G軟件測(cè)試工程師面試寶典文檔資料。以及相對(duì)應(yīng)的視頻學(xué)習(xí)教程免費(fèi)分享!其中包括了有基礎(chǔ)知識(shí)、Linux必備、Shell、互聯(lián)網(wǎng)程序原理、Mysql數(shù)據(jù)庫(kù)、抓包工具專題、接口測(cè)試工具、測(cè)試進(jìn)階-Python編程、Web自動(dòng)化測(cè)試、APP自動(dòng)化測(cè)試、接口自動(dòng)化測(cè)試、測(cè)試高級(jí)持續(xù)集成、測(cè)試架構(gòu)開發(fā)測(cè)試框架、性能測(cè)試、安全測(cè)試等。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
男朋友拍照有多“陰間”?網(wǎng)友:隨便一張都能做山海經(jīng)的插圖

男朋友拍照有多“陰間”?網(wǎng)友:隨便一張都能做山海經(jīng)的插圖

另子維愛讀史
2026-02-28 23:36:50
突發(fā)!郭正亮怒斥馬英九!

突發(fā)!郭正亮怒斥馬英九!

達(dá)文西看世界
2026-03-01 16:18:11
汪小菲在臺(tái)灣又和張?zhí)m急眼了,馬筱梅在旁勸說,張?zhí)m無奈透露心聲

汪小菲在臺(tái)灣又和張?zhí)m急眼了,馬筱梅在旁勸說,張?zhí)m無奈透露心聲

有范又有料
2026-03-01 17:06:32
一種戴久了可能致癌的首飾,很多人家里都有!

一種戴久了可能致癌的首飾,很多人家里都有!

距離距離
2026-02-26 13:18:17
81歲林豆豆現(xiàn)狀:已退休23年,獨(dú)居在北京老房子,用閱讀打發(fā)時(shí)間

81歲林豆豆現(xiàn)狀:已退休23年,獨(dú)居在北京老房子,用閱讀打發(fā)時(shí)間

攬星河的筆記
2025-11-12 12:36:17
50歲男子酷愛喝濃茶,茶葉能占半個(gè)杯子!連續(xù)5年確診腎結(jié)石,痛到打滾如生孩子!醫(yī)生提醒→

50歲男子酷愛喝濃茶,茶葉能占半個(gè)杯子!連續(xù)5年確診腎結(jié)石,痛到打滾如生孩子!醫(yī)生提醒→

大象新聞
2026-02-26 13:45:08
美國(guó)專家稱:崛起的中國(guó)并不可怕,真正可怕的是他們從來不會(huì)提及自身血統(tǒng)

美國(guó)專家稱:崛起的中國(guó)并不可怕,真正可怕的是他們從來不會(huì)提及自身血統(tǒng)

文史明鑒
2026-01-29 20:01:08
以色列炸瘋了:一次投入200架戰(zhàn)機(jī),24小時(shí)投擲1200枚彈藥

以色列炸瘋了:一次投入200架戰(zhàn)機(jī),24小時(shí)投擲1200枚彈藥

戰(zhàn)風(fēng)
2026-03-01 20:07:50
我們的網(wǎng)友給內(nèi)塔尼亞胡起了一個(gè)外號(hào)

我們的網(wǎng)友給內(nèi)塔尼亞胡起了一個(gè)外號(hào)

清暉有墨
2025-09-08 17:18:01
樓市走到現(xiàn)在,有一種“預(yù)感”越來越強(qiáng)烈了!或超出很多人的想象

樓市走到現(xiàn)在,有一種“預(yù)感”越來越強(qiáng)烈了!或超出很多人的想象

阿離家居
2026-03-01 16:25:00
意媒:特奧狀態(tài)出現(xiàn)斷崖式下跌,若這樣下去恐難參加世界杯

意媒:特奧狀態(tài)出現(xiàn)斷崖式下跌,若這樣下去恐難參加世界杯

懂球帝
2026-03-01 14:11:10
表態(tài)“毀滅性”報(bào)復(fù)美以,伊朗武器庫(kù)有哪些“家底”?

表態(tài)“毀滅性”報(bào)復(fù)美以,伊朗武器庫(kù)有哪些“家底”?

澎湃新聞
2026-02-28 18:59:23
美高官披露:獲悉哈梅內(nèi)伊等伊朗高層領(lǐng)導(dǎo)人在德黑蘭的一處院落開會(huì),由以色列實(shí)施“定點(diǎn)清除”

美高官披露:獲悉哈梅內(nèi)伊等伊朗高層領(lǐng)導(dǎo)人在德黑蘭的一處院落開會(huì),由以色列實(shí)施“定點(diǎn)清除”

極目新聞
2026-03-01 14:16:44
環(huán)球影城:一游樂項(xiàng)目突發(fā)故障致2人重傷!索賠超30萬元!

環(huán)球影城:一游樂項(xiàng)目突發(fā)故障致2人重傷!索賠超30萬元!

特種設(shè)備安全科普
2026-02-27 11:34:42
第94分鐘絕殺!西蒙尼狂歡,1億巨星立大功:終結(jié)14輪進(jìn)球荒

第94分鐘絕殺!西蒙尼狂歡,1億巨星立大功:終結(jié)14輪進(jìn)球荒

足球狗說
2026-03-01 05:58:12
周末信息如何影響市場(chǎng)?明天是紅色星期一?還是黑色星期一?

周末信息如何影響市場(chǎng)?明天是紅色星期一?還是黑色星期一?

春江財(cái)富
2026-03-01 08:39:41
哈梅內(nèi)伊四位親屬據(jù)稱在襲擊中身亡

哈梅內(nèi)伊四位親屬據(jù)稱在襲擊中身亡

每日經(jīng)濟(jì)新聞
2026-03-01 09:29:42
德黑蘭上空的“血色夜幕”:美以“隱形屠刀”如何肢解伊朗防空?

德黑蘭上空的“血色夜幕”:美以“隱形屠刀”如何肢解伊朗防空?

聰明小石頭
2026-03-01 15:44:16
美“福特”號(hào)航母駛離希臘克里特島

美“福特”號(hào)航母駛離希臘克里特島

財(cái)聯(lián)社
2026-02-26 16:57:07
震驚!網(wǎng)傳天津一中學(xué)未返校學(xué)生超100人,三分之二沒寫寒假作業(yè)

震驚!網(wǎng)傳天津一中學(xué)未返校學(xué)生超100人,三分之二沒寫寒假作業(yè)

火山詩(shī)話
2026-03-01 07:24:21
2026-03-01 20:43:00
51Testing軟件測(cè)試網(wǎng) incentive-icons
51Testing軟件測(cè)試網(wǎng)
中國(guó)軟件測(cè)試人的精神家園
1528文章數(shù) 13252關(guān)注度
往期回顧 全部

科技要聞

小米超跑概念車全球首秀!殺入頂豪俱樂部

頭條要聞

伊朗代表在安理會(huì)會(huì)議上直接警告美方:建議你保持禮貌

頭條要聞

伊朗代表在安理會(huì)會(huì)議上直接警告美方:建議你保持禮貌

體育要聞

火箭輸給熱火:烏度卡又輸斯波教練

娛樂要聞

《江山為聘》:吳謹(jǐn)言陳哲遠(yuǎn)燃炸朝堂

財(cái)經(jīng)要聞

中東局勢(shì)升級(jí) 如何影響A股、黃金和原油

汽車要聞

理想汽車2月交付26421輛 歷史累計(jì)交付超159萬輛

態(tài)度原創(chuàng)

游戲
房產(chǎn)
健康
旅游
軍事航空

《COD》吃癟!被卷入法律糾紛:痛失一項(xiàng)知名品牌

房產(chǎn)要聞

濱江九小也來了!集齊海僑北+哈羅、寰島...江東教育要炸了!

轉(zhuǎn)頭就暈的耳石癥,能開車上班嗎?

旅游要聞

去年秋天至今“沒睡過覺”,河津櫻早開刷新15年紀(jì)錄

軍事要聞

伊朗最高領(lǐng)袖哈梅內(nèi)伊遇害 中方回應(yīng)

無障礙瀏覽 進(jìn)入關(guān)懷版