原文
在python中,物件賦值實際上是物件的的引用,當建立乙個物件,然後把它賦值給另外乙個變數的時候,python沒有拷貝這個物件,而只是拷貝了這個物件的引用,所以就出現了淺複製,即複製後原物件改變後,複製出來的物件也會改變,要防止複製出來的物件改變,就要使用深複製
python複製三種方式
(1)使用「=」直接賦值,傳遞物件的引用而已。原始列表改變,被賦值的物件也會做相同改變
# b = a
list1 =[1
,2,'1',[
4,'2']
]list2= list1
print
(list1)
# [1, 2, '1', [4, '2']]
print
(list2)
# [1, 2, '1', [4, '2']]5)
# 雖然僅僅對列表1操作,但是列表2跟著變化了
print
(list1)
# [1, 2, '1', [4, '2'], 5]
print
(list2)
# [1, 2, '1', [4, '2'], 5]
(2)copy淺複製,沒有拷貝子物件,所以原始資料改變,子物件也會發生變化
注:copy淺複製與list[:]效果一致
import copy
list1 =[1
,2,'1',[
4,'2']
]list2 = copy.copy(list1)
print
(list2)
# [1, 2, '1', [4, '2']]
list3 = list1[:]
print
(list3)
# [1, 2, '1', [4, '2']]
'c')
list1[3]
5)print
(list1)
# [1, 2, '1', [4, '2', 5], 'c']
print
(list2)
# [1, 2, '1', [4, '2', 5]]
print
(list3)
# [1, 2, '1', [4, '2', 5]]
(3)深拷貝,包含物件裡面的自物件的拷貝,所以原始物件的改變不會造成深拷貝裡任何子元素的改變
import copy
list1 =[1
,2,'1',[
4,'2']
]list2 = copy.deepcopy(list1)
print
(list2)
# [1, 2, '1', [4, '2']]
'c')
list1[3]
5)print
(list1)
# [1, 2, '1', [4, '2', 5], 'c']
print
(list2)
# [1, 2, '1', [4, '2']]
綜上,使用「=」賦值相當於引用,賦值前後的變數其實是一樣的,而使用deepcopy,則只是賦值了當時的資料,後續不會變化。 淺拷貝 深拷貝和淺賦值 深賦值
include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...
python的賦值 深拷貝與淺拷貝
a 1,2,3,6,45,12,56,69 b aprint a print b print 這是一段賦值 輸出結果 e install python3.7.3 python.exe f pycharm workspace day01 copydemo.py 1,2,3,6,45,12,56,69,...
Python 賦值 淺拷貝 深拷貝
賦值 a b,只拷貝了物件的引用,沒有拷貝內容。兩個物件的id一樣 淺拷貝 copy.copy 構造乙個新的復合物件,然後將子物件引用插入到原始物件的副本中。深拷貝 copy.deepcopy 構造乙個新的復合物件,然後遞迴地將子物件副本插入原始物件的副本。給個栗子 從這個栗子可以看出,對c進行修改...