python默認深拷貝_Python 深拷貝與淺拷貝

首先分享Python里面的數據類型

1、不可變類型:Number(數字)、String(字符串)、Tuple(元組)。

不可變數據類型在第一次聲明賦值的時候, 會在內存中開辟一塊空間, 用來存放這個變量被賦的值,? 而這個變量實際上存儲的, 并不是被賦予的這個值, 而是存放這個值所在空間的內存地址, 通過這個地址, 變量就可以在內存中取出數據了. 所謂不可變就是說, 我們不能改變這個數據在內存中的值, 所以當我們改變這個變量的賦值時, 只是在內存中重新開辟了一塊空間, 將這一條新的數據存放在這一個新的內存地址里, 而原來的那個變量就不在引用原數據的內存地址而轉為引用新數據的內存地址了.

如圖:

In [11]: a = 1 #int為不可變類型,賦值

?

In [12]: id(a) #查看a地址

Out[12]: 4541615920In [13]: id(1) #查看數字1的地址

Out[13]: 4541615920?

In [14]: a = 2 #為a重新賦值

?

In [15]: id(a) #查看a地址,指向新的內存地址

Out[15]: 4541615952?

In [16]: id(2)

Out[16]: 4541615952?

In [17]: id(1)

Out[17]: 4541615920

In [28]: a = "hello" #為a賦值 hello

?

In [29]: b = a #將a賦值給a

?

In [30]: id(a)

Out[30]: 4572905712?

In [31]: id(b) #通過查看a和b的地址,說明a和b指向同一個地址

Out[31]: 4572905712?

In [32]: b = "hi" #為b賦值 hi

?

In [33]: a #查看a未被修改

Out[33]: 'hello'?

In [34]: id(a) #查看a地址未發生修改

Out[34]: 4572905712?

In [35]: id(b) #查看b指向新的地址,說明b=a時,是將a的引用指向b

Out[35]: 4544178736

b=a直接賦值時,默認是淺拷貝傳遞對象的引用而已,原始數據若為不可變類型時,被賦值的b改變時,相當于在內存中重新開辟了一塊空間, 將這一條新的數據存放在這一個新的內存地址里, 而原來的那個變量就不在引用原數據的內存地址而轉為引用新數據的內存地址了.

2、可變類型:Set(集合)、List(列表)、Dictionary(字典)。

當數據類型對應的變量的值發生改變時,它對應的內存地址也會發生改變,即當?e?=?[1,2]?時,是e指向列表[1,2]對象,而不是將e指向列表[1,2]的地址

如圖:

In [10]: e = [1,2]

?

In [11]: id(e)

Out[11]: 4408548080?

In [12]: id([1,2]) #e指向[1,2]對象,而不是[1,2]的地址

Out[12]: 4408714656

In [10]: e = [1,2] #給變量e賦值可變類型列表[1,2]

?

In [11]: id(e) #查看e地址

Out[11]: 4408548080?

In [12]: id([1,2]) #查看列表[1,2]地址

Out[12]: 4408714656?

In [13]: f = e #將e賦值給f,兩者共享同一個列表[1,2]對象

?

In [14]: id(f) #查看f地址,其實是將c指向于e的引用地址,而非列表[1,2]的實際地址

Out[14]: 4408548080?

In [15]: e[0] = 11 #通過e修改列表內元素

?

In [16]: e

Out[16]: [11, 2]

?

In [17]: f #查看f中對應元素同樣被修改,驗證e和f指向一個引用對象,說明f=e時,是將e的對象的地址指向f

Out[17]: [11, 2]

f?=?e直接賦值時,默認是淺拷貝傳遞對象的引用而已,原始數據e若為可變類型發生變化,被賦值的f也會做相同的改變。

3. 淺拷貝

淺拷貝是對于一個對象的頂層拷貝

通俗的理解是:拷貝了引用,并沒有拷貝內容

In [36]: a = [1,2]

?

In [37]: b =a

?

In [38]: id(a)

Out[38]: 4573291056?

In [39]: id(b) #淺拷貝,a和b地址相同,說明b=a是對a引用的拷貝

Out[39]: 4573291056

通過上面的結果,說明當給一個變量賦值時。其實就是講數據的引用復制了一份給另外一個變量 ,就是屬于簡單的淺拷貝

In [36]: a = [1,2]

?

In [37]: b =a

?

In [38]: id(a)

Out[38]: 4573291056?

In [39]: id(b)

Out[39]: 4573291056?

In [40]: a[0] = 11?

In [41]: a #a中元素被修改

Out[41]: [11, 2]

?

In [42]: b #b中元素被修改

Out[42]: [11, 2]

通過上面的結果,說明通過任何一個引用修改可變變量之后,另外一個變量的值也發生了變化。

In [24]: g = [2,3]

?

In [25]: h = copy.copy(g) #淺拷貝

?

In [26]: id(g)

Out[26]: 4409269536?

In [27]: id(h)

Out[27]: 4408716176?

In [28]: id([2,3])

Out[28]: 4408685824?

In [30]: id(2) #獲取2的地址

Out[30]: 4378861392?

In [31]: id(g[0]) #獲取g[0]位置的地址

Out[31]: 4378861392?

In [32]: id(h[0]) #獲取h[0]位置的地址

Out[32]: 4378861392

通過上面的結果,說明淺拷貝只是對外層引用的拷貝,內層地址一樣。

In [33]: a = [11,22]

?

In [34]: b = [33,44]

?

In [35]: c =[a,b]

?

In [36]: id(a)

Out[36]: 4408713536?

In [37]: id(b)

Out[37]: 4408547680?

In [38]: id(c)

Out[38]: 4408615712?

In [39]: d = copy.copy(c) #對c進行淺拷貝,得到d

?

In [40]: id(d) #查看d地址

Out[40]: 4409421248?

In [41]: id(d[0]) #查看d[0]位置元素地址,與a地址相同,說明只進行外層拷貝

Out[41]: 4408713536?

In [42]: id(d[1]) #查看d[1]位置元素地址,與b地址相同,說明只進行外層拷貝

Out[42]: 4408547680?

In [43]: a.append(55) #給a列表添加元素

?

In [44]: c #查看c中元素也發生變化

Out[44]: [[11, 22, 55], [33, 44]]

?

In [45]: d #查看d中元素也發生變化,說明是對外層的拷貝

Out[45]: [[11, 22, 55], [33, 44]]

?

In [46]: d.append(66) #給d中添加元素

?

In [47]: d #查看d中元素發生變化

Out[47]: [[11, 22, 55], [33, 44], 66]

?

In [48]: c #查看c中元素未發生變化,說明d未外層拷貝

Out[48]: [[11, 22, 55], [33, 44]]

通過上面的結果,說明淺拷貝只是對外層引用的拷貝,內層地址一樣,修改外層,拷貝的新對象不會發生變化,修改內層元素,拷貝的新對象會發生變化。

4. 深拷貝

深拷貝是對于一個對象所有層次的拷貝(遞歸), 所以原始對象的改變不會造成深拷貝里任何子元素的改變

In [61]: a = [11,22]

?

In [62]: b = [33,44]

?

In [63]: c =[a,b]

?

In [64]: c

Out[64]: [[11, 22], [33, 44]]

?

In [65]: d = copy.deepcopy(c) #深拷貝得到d

?

In [66]: d

Out[66]: [[11, 22], [33, 44]]

?

In [67]: f = copy.copy(c) #淺拷貝得到f

?

In [68]: f

Out[68]: [[11, 22], [33, 44]]

?

In [69]: a.append(55) #a中添加元素55

?

In [70]: d #深拷貝的d中沒有修改,說明是對內層也進行copy

Out[70]: [[11, 22], [33, 44]]

?

In [71]: f #淺拷貝的f中發生變化,說明是只對外層進行了copy

Out[71]: [[11, 22, 55], [33, 44]]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533760.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533760.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

上傳 mp4 格式判斷_視頻如何轉換成通用的MP4格式?按下這個鍵,10秒就能搞定...

我們在網上下載視頻的時候,有很多的視頻都是無法播放的,或者是需要特定的播放器才可以播放。其實,只要把這些視頻的格式轉換成通用的MP4格式即可。如果你還不知道怎么轉換視頻格式,下面就教大家兩個小方法,百試百靈。一…

android不能在主線程,安卓開發:主線程真的不能做UI操作嗎?這一點很多程序員都沒想到...

只要參與過安卓項目開發一兩年的朋友們應該清楚,為了避免UI渲染出現異常安卓框架限制UI操作只能在主線程中進行,如果貿然在子線程做了UI操作結果會怎樣?我們隨便寫下了如下測試代碼。不出意外的話,代碼執行報錯拋出了名為CalledFr…

c++注釋快捷鍵_Jupyter Notebook amp; Lab快捷鍵大全

Jupyter有兩種模式,命令模式和編輯模式,分別有不同的快捷鍵。編輯模式(按鍵 Enter 切換):可以往單元中鍵入代碼或文本,此時單元格被藍色的框線包圍,且命令模式下的快捷鍵不生效; 命令模式 (按鍵 Esc 開啟)&…

多核cpu應用場景_CPU占用100%!PC卡頓原來可以這么解決:多場景多任務也流暢

現代生活里,不論是工作還是生活,多開軟件和處理事務可以說都是家常便飯的事情。一邊玩著醉心已久的游戲,一邊解壓著新的電影和游戲;為了查詢資料,一不小心打開了數十個網頁;復雜繁重的工作鑄就了動輒上百兆…

swot分析法案例_項目型銷售案例剖析的五大步驟

我們的案例分析方式是根據哈佛大學與中歐國際工商學院的案例分析方法來總結出我們的模式的。這種分析方法包括兩種互相關聯和依賴的方面。第一方面,就是要對所指定的將供集體討論的案例,做出深刻而有意義的分析,包括找出案例所描述的情景中存…

autojs 云控_autojs websocket 核心示例代碼,云控技術

//初始化方法function recordInit(scriptName){//let ipInfoJson getIP()// let ip ipInfoJson.cip// let location ipInfoJson.cnamelet deviceIMEI ,deviceBrand,deviceModel,AndroidVer,deviceWH,deviceBoard,deviceMac,AndroidIdtry {deviceBrand device.brand;//制造…

定時器和promise_從Promise鏈理解EventLoop

面試題new Promise(resolve > { setTimeout(()>{ console.log(666); new Promise(resolve > { resolve(); }) .then(() > {console.log(777);}) }) resolve(); }) .then(() > { new Promise(resolve > { resolve(); …

ugui源碼_UGUI整體解決方案基礎篇(Unity 2019)

課程介紹:本課程是UGUI系列課程的第一篇:基礎篇主要是講解UGUI的基礎組件及接口的使用方法,目前UGUI是unity最常用的UI系統,這部分基礎只是是每個同學都應該掌握的,這里我就是簡單的講解了用法,大家對UGUI熟…

android 實例源碼解釋,Android Handler 原理分析及實例代碼

Android Handler 原理分析Handler一個讓無數android開發者頭疼的東西,希望我今天這邊文章能為您徹底根治這個問題今天就為大家詳細剖析下Handler的原理Handler使用的原因1.多線程更新Ui會導致UI界面錯亂2.如果加鎖會導致性能下降3.只在主線程去更新UI,輪詢處理Handl…

amd cpu排行_最新intel和amd處理器性能排行cpu天梯圖2019

現在市面上cpu廠家有很多,比如常見的intel系列的、amd系列CPU,cpu對電腦起著至關重要的作用,所以我們需要知道cpu性能的好壞,為此小編這就給大家帶來最新intel和amd處理器性能排行對比天梯圖,大家可以了解一下吧。inte…

python中的對象列表_Python內建的對象列表

Python內建的對象列表剛寫Python肯定會遇到這樣的情況,想寫些什么,但又不知從何寫起...在我看來問題在于我們不知道有什么東東可以拿來玩,這里列出Python的內建對象,稍微歸類了一下,多看幾遍代碼自然筆上生花&#xff…

電腦會顯示android,怎么在電腦上顯示、操作安卓手機

想要在電腦上顯示、操作安卓手機,該怎么辦,那么怎么在電腦上顯示、操作安卓手機的呢?下面是學習啦小編收集整理的怎么在電腦上顯示、操作安卓手機,希望對大家有幫助~~在電腦上顯示、操作安卓手機的方法工具/原料windows操作系統安卓手機電腦…

git version是什么軟件_Deepin 15.11 安裝 ZoneMinder 視頻監控軟件

Zoneminder是一款開源的視頻監控軟件,可以很方便的連接ip攝像頭。因計劃將家中的監控攝像頭引入NAS,在一臺deepin系統的筆記本是先進行了測試。UBUNTU和debian系統都是很容易安裝這個軟件的。未來在NAS上用docker啟動一個專門的zoneminder,do…

看不出svp補幀_專業補幀軟件SVP4 實現PotPlayer視頻補幀教程

雖然能實現幀率翻倍,不過現在視頻絕大多數都是24幀或25幀,翻倍也才48幀,沒辦法實現補幀后達到60幀的效果。SVP4是一款專業版視頻補幀軟件,提供GPU加速,并允許使用中檔CPU和幾乎任何GPU硬件為60Hz的FullHD 1080p視頻重新…

android 通知歷史,Android P新特性:追蹤應用通知歷史

原標題:Android P新特性:追蹤應用通知歷史IT之家3月9日消息 不久前,谷歌已經正式推出了首個Android P開發者預覽版,包含了許多新特性。對此,IT之家也進行了一系列報道。該系統的新特性也正在不斷被發現。例如最新消息顯…

文件另存為時名稱會改變_易經:人處在困境時,不要焦慮,改變固定習慣,就會迎來轉機...

我讀《易經》,悟到一些規律:人的一生,起起落落,時而順利,時而受困,都是正常現象,沒有必要把困難和壓力看得太重。人處在困境時,不要焦慮,只要改變你的固定習慣&#xff0…

ubuntu系統寫路由指令_在Ubuntu中如何查看網絡路由表詳解,

在Ubuntu中如何查看網絡路由表詳解,什么是Linux中的路由和路由表?路由的過程意味著IP包在網絡上從一點傳輸到另一點。當你向某人發送電子郵件時,你實際上是在將一系列IP數據包或數據報從你的系統傳輸到另一個人的計算機上。從計算機發送的數據…

jspdf html轉換pdf,使用jspdf將HTML轉換為pdf時出錯

對于一個角度項目,我試圖將包含HTML代碼的字符串變量轉換為pdf文件。我安置了所有的家屬,比如:jspdf格式光柵化HTML我的代碼如下:b64DecodeUnicode(str) {return decodeURIComponent(atob(str).split().map(function(c) {return % (00 c.charCodeAt(0).toString(16)).slice(-…

澄海哪里學機器人編程_終于發現小孩有必要學機器人編程嗎

讓孩子學習編程的目的,就像其他教育方式一樣,只是希望能幫助孩子找到他的興趣點,打開孩子的獲取知識和能力的大門。一起來看看一篇小孩有必要學機器人編程嗎。小孩有必要學機器人編程嗎編程和英語類似,屬于基本技能,未…

鴻蒙系統替代iOS,華為橫空出世!鴻蒙系統,能否替代安卓IOS?

原標題:華為橫空出世!鴻蒙系統,能否替代安卓IOS?從長遠來看,華為主推鴻蒙系統是必然的選擇。畢竟安卓系統為谷歌的,而由于美國限制,讓華為格外被動。命運掌握在自己手里,才有足夠的話…