Python中的賦值(復制)、淺拷貝、深拷貝之間的區別


  1.賦值: 只是復制了新對象的引用,不會開辟新的內存空間。
  2.淺拷貝: 創建新對象,其內容是原對象的引用。
    淺拷貝有三種形式:切片操作,工廠函數,copy模塊中的copy函數。
    如: lst = [1,2,3,[4,5]]
    切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst]
    工廠函數:lst1 = list(lst)
    copy函數:lst1 = copy.copy(lst)

    淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在lst中有一個嵌套的list[4,5],如果我們修改了它,情況就不一樣了。

  3.深拷貝:只有一種形式,copy模塊中的deepcopy函數。
     和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。
     深拷貝出來的對象是一個全新的對象,不再與原來的對象有任何關聯。

>>> import copy
>>> a = [1,2,3,4,['a','b']] #定義一個列表a
>>> b = a #賦值
>>> c = copy.copy(a) #淺拷貝
>>> d = copy.deepcopy(a) #深拷貝

>>> a.append(5)
>>> print(a)
[1, 2, 3, 4, ['a', 'b'], 5] #a添加一個元素5
>>> print(b) 
[1, 2, 3, 4, ['a', 'b'], 5] #b跟着添加一個元素5 
>>> print(c)
[1, 2, 3, 4, ['a', 'b']] #c保持不變
>>> print(d)
[1, 2, 3, 4, ['a', 'b']] #d保持不變

>>> a[4].append('c') 
>>> print(a)
[1, 2, 3, 4, ['a', 'b', 'c'], 5] #a中的list(即a[4])添加一個元素c
>>> print(b)
[1, 2, 3, 4, ['a', 'b', 'c'], 5] #b跟着添加一個元素c
>>> print(c)
[1, 2, 3, 4, ['a', 'b', 'c']] #c跟着添加一個元素c
>>> print(d)
[1, 2, 3, 4, ['a', 'b']] #d保持不變

#說明如下:
#1.外層添加元素時, 淺拷貝c不會隨原列表a變化而變化;內層list添加元素時,淺拷貝c才會變化。
#2.無論原列表a如何變化,深拷貝d都保持不變。
#3.賦值對象隨着原列表一起變化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM