在python中,對象賦值實際上是對象的的引用,當創建一個對象,然后把它賦值給另外一個變量的時候,python沒有拷貝這個對象,而只是拷貝了這個對象的引用,多以就出現了淺復制,即復制后原對象改變后,復制出來的對象也會改變,要防止復制出來的對象改變,就要使用深復制
python復制三種方式
(1)直接賦值,傳遞對象的引用而已。原始列表改變,被賦值的對象也會做相同改變
1 list1 = [1,2,'a',[4,'ss']] 2 list2 = list1 3 print(list2) #result;[1, 2, 'a', [4, 'ss']] 4 print(list3) 5 list1.append(10) 6 print(list1,list2) #[1, 2, 'a', [4, 'ss'], 10] [1, 2, 'a', [4, 'ss'], 10]
(2)copy淺復制,沒有拷貝子對象,所以原始數據改變,子對象也會發生變化
注:copy淺復制與list[:]效果一致
1 list1 = [1,2,'a',[4,'ss']]
2 import copy 3 list2 = copy.copy(list1) 4 print(list2) #[1, 2, 'a', [4, 'ss']] 5 list1.append('c') 6 print(list1,list2) #[1, 2, 'a', [4, 'ss'], 'c'] [1, 2, 'a', [4, 'ss']] 7 list1[3].append(5) 8 print(list1,list2) #里面的子對象被改變了[1, 2, 'a', [4, 'ss', 5], 'c'] [1, 2, 'a', [4, 'ss', 5]]
(3)深拷貝,包含對象里面的自對象的拷貝,所以原始對象的改變不會造成深拷貝里任何子元素的改變
1 list1 = [1,2,'a',[4,'ss']] 2 import copy 3 list2 = copy.deepcopy(list1) 4 print(list2) #[1, 2, 'a', [4, 'ss']] 5 list1.append('c') 6 print(list1,list2) #list2始終沒有變[1, 2, 'a', [4, 'ss'], 'c'] [1, 2, 'a', [4, 'ss']] 7 list1[3].append(5) 8 print(list1,list2) #list2始終沒有變[1, 2, 'a', [4, 'ss', 5], 'c'] [1, 2, 'a', [4, 'ss']]