python深淺copy和賦值

Python直接賦值,淺copy和深copy的比較

  基於引用和對象(python引用和對象分離)

總結:

  直接賦值:a = b --》a,b兩個引用指向相同的對象
  淺copy:a爲b的copy --》 copy(新建)b的不可變子對象,共用可變子對象
  深copy:a爲b的深copy--》copy(新建)b的全部子對象,二者對象無關聯
  
ps:對象的值相等,內存地址不必定相同(小數據池)
 
詳細解析以下:
 

在python中,對象賦值其實是對象的引用。當建立一個對象,而後把它賦給另外一個變量的時候,python並無拷貝這個對象,而只是拷貝了這個對象的引用html

通常有三種方法,python

alist=[1,2,3,["a","b"]]app

 

(1)直接賦值,默認淺拷貝傳遞對象的引用而已,原始列表改變,被賦值的b也會作相同的改變post

>>> b=alist
>>> print b
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print b
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]url

(2)copy淺拷貝,沒有拷貝可變子對象。共享可變子對象(可變子對象隨之變化)spa

>>> import copy3d

>>> c=copy.copy(alist)
>>> print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]code

>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']] 裏面的子對象被改變了htm

 

 

(3)深拷貝,包含對象裏面的子對象的拷貝,因此原始對象的改變不會形成深拷貝里任何子元素的改變對象

>>> import copy

>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始終沒有改變
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始終沒有改變
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']]  始終沒有改變

 

 

 
 
參考博客:https://www.cnblogs.com/xueli/p/4952063.html
相關文章
相關標籤/搜索