Python 常見問題梳理(1)

-1. 深拷貝和淺拷貝原理
import copy
a = [1,2,3,4,[‘a’,‘b’]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append(‘c’)

在這裏插入圖片描述
首先我們看看看b的情況,b實際上和a指向的是同一個值,就好比人的大名和小名,只是叫法不同,但還是同一個人
在這裏插入圖片描述
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZMqgylVh-1593869479531)(https://img-log.csdnimg.cn/20200704213109874.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hcmt3YW5neXU=,size_16,color_FFFFFF,t_70)]
接下來再看看c的情況,c的情況和a.copy()的情況是一樣的,都是我們所謂的淺拷貝(淺複製),淺拷貝只會拷貝父對象,不會拷貝子對象,通俗的說就是隻會拷貝到第二層
在這裏插入圖片描述
若父對象發生變化,c不會變化,因爲它已經複製的所有父對象,假如子對象發生變化則c會變,比如c[4]和a[4]實際都是一個變量list,他們都指向子對象,若子對象發生變化,他們必然都變化,比如變成[“a”,“d”],那它們指向的值也就變成了a、d。
再看看d的情況,這就是我們所說的深複製,不管a進行什麼操作,都不會改變d了,他們已經指向不同的值(這裏是指在內存中存儲的位置不同了)。
在這裏插入圖片描述
總結:
b=a,只是換了一個名字,a怎麼變b就怎麼變,
c是淺複製,只複製了a的部分值,仍然共用某些值,所以在對a的子對象進行操作時會改變c
d是深複製,完全複製了a的所有值,已經完全與a無關,對a的任何操作都不會影響d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章