Python中的深淺拷貝

Python中的深淺拷貝

前言:咱們在瞭解深淺拷貝以前首先須要明白的一點知識python

  1. 不可變類型數據:不可變類型即指當改變其內元素時,內存空間將會發生變化,好比常見的不可變類型有:str,boolean, int,tuple。app

    temp = "哈哈哈"
    ret = temp.replace("哈", "嘿", 2)
    print(temp)      # 哈哈哈
    print(ret)       # 嘿嘿哈
    # 咱們能夠看到temp的值並無發生改變,這就是爲何對str數據改變以後須要從新賦值的緣由,由於它是不可變類型,只能從新找一個值接收。
  2. 可變類型數據:當改變其內元素時,內存空間不會發生變化,好比常見的可變類型有:list,set,dict。3d

    lst = [1, 2, 3]
    lst.append(4)
    print(lst)   # [1, 2, 3, 4]
    # 而對可變類型數據進行操做時,由於它是可變類型數據,沒有改變原來的內存地址空間,因此不須要從新賦值,能夠直接打印
  3. 賦值與深淺拷貝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, ["哈哈", "嘿嘿"]]
    # 深拷貝即徹底拷貝,無論裏面的元素是否含有可變類型數據,拷貝的就是數據自己,而不是對象內存地址。
  4. 插圖對象

    淺拷貝blog

深拷貝ip

tips:圖畫的很糙,可能大家看了也不懂,但我就是要畫 ~~內存

相關文章
相關標籤/搜索