10 深淺拷貝

2022-09-05 16:48:16 字數 1771 閱讀 1673

1.賦值

l1=[1,2,3,4,[5,6,7]]

l2=l1 #賦值 賦值不是拷貝

print(l1)

print(l2)

2.淺拷貝
l1=[1,2,3,4,[5,6,7]]

l2=l1[:]#淺拷貝

l2=l1.copy()#淺拷貝---只拷貝第一層

print(id(l1[0]))#記憶體位址相同

print(id(l2[0]))#記憶體位址相同

淺拷貝會建立乙個新的列表(容器),

新建立的列表中的元素和原列表的元素用的是同一記憶體空間

l1 = [1,2,3,4]

l2 = l1.copy()

print(l1)

print(id(l1))

print(id(l2))

print(id(l1[0]))

print(id(l2[0]))

兩個容器的記憶體位址不同,裡面與元素的記憶體位址相同

例1:li = [1,2,32,[3,4,5]]

l2 = li.copy()

print(l2)#[1, 2, 32, [3, 4, 5]]

print(li)#[1, 2, 32, [3, 4, 5], 8]

print(l2)#[1, 2, 32, [3, 4, 5, 8]]

print(li)#[1, 2, 32, [3, 4, 5, 8]]

例2:l1 = [1,2,3,(1,2,3)]

l2 = l1.copy()

l2[-1] = 6

print(l1) # 不變[1,2,3,(1,2,3)]

print(l2) # 不變[1,2,3,6] 改變了列表中最後乙個元素的指向關係

l1 = [1,2,3,4,[5,6,7,]]

l2 = l1.copy()

print(l2) #[1,2,3,4,[5,6,7,8]]

3.深copy
import copy

li = [1,2,3,4,5,[6,7,8]]

l2 = copy.deepcopy(li)

print(li)

# print(id(li))

print(id(li[-1]))

print(l2)

# print(id(l2))

print(id(l2[-1]))

深拷貝 --

不可變的資料型別和原列表指向同乙個空間

可變資料會建立乙個新的空間

1.import copy

li = [1,2,3,4,5,[6,7,8]]

l2 = copy.deepcopy(li)

print(li)#[1, 2, 3, 4, 5, [6, 7, 8, 678]]

print(l2)#[1, 2, 3, 4, 5, [6, 7, 8]]

2.import copy

li = [3,4,5,[1,2,3,4],6,7,8,]

l2 = copy.deepcopy(li)

li[-1]['k'] = "a"

print(li)

print(l2)

例1:

dic = {}   # "v":4

li = #[,,,,]

for i in range(0,5):

dic["v"] = i

print(li)

>>>[, , , , ]

深淺拷貝以及深淺拷貝的方法

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...

拷貝和深淺拷貝

當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...

12 深淺拷貝

複製物件的基本概念 複製乙個物件作為副本,它會開闢一塊新的記憶體 堆記憶體 來儲存副本物件,就像複製檔案一樣.即源物件和副本物件是兩塊不同的記憶體區域.物件具備複製功能,必須實現協議,協議.常用的可複製物件有 nsnumber,nsstring,nsarray,nsdictionary.nsmuta...