前言:咱們在瞭解深淺拷貝以前首先須要明白的一點知識python
不可變類型數據:不可變類型即指當改變其內元素時,內存空間將會發生變化,好比常見的不可變類型有:str,boolean, int,tuple。app
temp = "哈哈哈" ret = temp.replace("哈", "嘿", 2) print(temp) # 哈哈哈 print(ret) # 嘿嘿哈 # 咱們能夠看到temp的值並無發生改變,這就是爲何對str數據改變以後須要從新賦值的緣由,由於它是不可變類型,只能從新找一個值接收。
可變類型數據:當改變其內元素時,內存空間不會發生變化,好比常見的可變類型有:list,set,dict。3d
lst = [1, 2, 3] lst.append(4) print(lst) # [1, 2, 3, 4] # 而對可變類型數據進行操做時,由於它是可變類型數據,沒有改變原來的內存地址空間,因此不須要從新賦值,能夠直接打印
賦值與深淺拷貝code
# 賦值 lst = [1, 2, 3, 4] lst2 = lst lst2.append(5) print(lst) # [1, 2, 3, 4, 5] print(lst2) # [1, 2, 3, 4, 5] # 由於lst是可變類型,因此在賦值時是將lst的內存地址賦值給了lst2.也就意味着它們指向了同一個內存空間,因此當其中任意一個對裏面的元素進行操做時,另外一個也會改動。 # 淺拷貝 import copy lst = [1, 2, 3, ["哈哈", "嘿嘿"]] # lst2 = lst.copy() 淺拷貝 lst2 = copy.copy(lst) # 淺拷貝,兩者任選其一,都是淺拷貝 print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿"]] lst[3].append("嘻嘻") print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿", "嘻嘻"]] # 從中咱們能夠看到,當進行淺拷貝時,拷貝以後的對象並非徹底和原對象沒有關係,當原對象對裏面的列表進行修改時,拷貝後的對象裏面的列表也跟着修改。這就稱爲淺拷貝。 # 當進行淺拷貝時會對裏面每一個元素進行拷貝,然而當裏面有一個可變類型數據時,它這時候就不是拷貝數據自己,而是拷貝的這個可變數據的內存地址,這也就能解釋爲何改變原有對象還能對拷貝後的對象產生影響了,由於它們自己仍是指向同一個內存地址。 # 你也能夠簡單理解淺拷貝:淺拷貝只拷貝第一層。 # 深拷貝 import copy lst = [1, 2, 3, ["哈哈", "嘿嘿"]] lst2 = copy.deepcopy(lst) # 深拷貝 print(lst2) # [1, 2, 3, ["哈哈", "嘿嘿"]] lst[3].append("嘻嘻") print(slt2) # [1, 2, 3, ["哈哈", "嘿嘿"]] # 深拷貝即徹底拷貝,無論裏面的元素是否含有可變類型數據,拷貝的就是數據自己,而不是對象內存地址。
插圖對象
淺拷貝blog
深拷貝ip
tips:圖畫的很糙,可能大家看了也不懂,但我就是要畫 ~~內存