python學習筆記之深拷貝和淺拷貝的區別

2021-10-08 20:00:09 字數 4242 閱讀 3359

python深拷貝和淺拷貝的區別

1:在考慮深拷貝和淺拷貝區別之前,我們需要知道python中可變物件和不可變物件

2:淺拷貝和深拷貝區別

淺拷貝

#淺拷貝

#1:淺拷貝:可變物件(物件中有不可變資料型別)

#總結:

#拷貝出來的物件和原有物件位址不是同乙個,但是物件中的一一對應元素位址均相同;

#如果是對原物件中可變元素進行值的修改,那麼拷貝物件中響應元素也會被修改

alist =[10

,[123,

345]

]copylist = copy.copy(alist)

#1-1:alist和copylist元素值

print

(f'alist:'

)#輸出 alist:[10, [123, 345]]

print

(f'copylist:'

)#copylist:[10, [123, 345]]

#1-2 alist和copylist的id位址不一致

print(id

(alist)

)print(id

(copylist)

)#1-3 alist和copylist中的不可變物件(int型別)id位址一致

print(id

(alist[0]

))print(id

(copylist[0]

))#1-4 alist和copylist中的可變物件(list型別)id位址一致

print(id

(alist[1]

))print(id

(copylist[1]

))#1-5 alist增加元素,copylist並沒有增加元素

'straa'

)print

(f'alist:'

)#輸出alist:[10, [123, 345], 'straa']

print

(f'copylist:'

)#輸出copylist:[10, [123, 345]]

#1-6 alist中不可變元素改變值,copylist值沒有改變

alist[0]

=1print

(f'alist:'

)#輸出alist:[1, [123, 345], 'straa']

print

(f'copylist:'

)#輸出copylist:[10, [123, 45]]

alist[1]

2222

)print

(f'alist:'

)#輸出alist:[1, [123, 345, 2222], 'straa']

print

(f'copylist:'

)#輸出copylist:[10, [123, 345, 2222]]

#2:淺拷貝:不可變物件

#總結:

# 拷貝的是內容,由於是不可變物件,所以,拷貝出來的物件位址和原有位址是相同的。

# 如果原有物件改變了值,那麼變數所改變的位址也就改變了,拷貝物件還是指向原有位址,內容不會改變

bstr =

'abcde'

copybstr = copy.copy(bstr)

#1-1:bstr和copybstr元素值

print

(f'bstr:'

)#輸出 bstr:abcde

print

(f'copybstr:'

)#輸出 copybstr:abcde

#1-2 bstr和copybstr的id位址一致

print(id

(bstr)

)print(id

(copybstr)

)#1-3

bstr =

'abcdef'

print

(f'bstr:'

)#輸出 bstr:abcdef

print

(f'copybstr:'

)#輸出 copybstr:abcde

深拷貝

#深拷貝

#1:可變物件(物件中有不可變資料型別)

#總結:原有物件和拷貝物件是兩個沒有關係的物件

#拷貝出來的物件和原有物件位址不是同乙個

# 物件中的元素如果是可變資料型別那麼位址不相同,若果元素是不可變資料型別,那麼位址相同(元素值沒有變化);

#如果是對原物件中可變元素進行值的修改,那麼拷貝物件中響應元素不會被修改,因為操作的id位址不同,自然不會被影響

alist =[10

,[123,

345]

]deepcopylist = copy.deepcopy(alist)

#1-1:alist和deepcopylist元素值

print

(f'alist:'

)#輸出 alist:[10, [123, 345]]

print

(f'deepcopylist:'

)#deepcopylist:[10, [123, 345]]

#1-2 alist和deepcopylist的id位址,不一致

print(id

(alist)

)print(id

(deepcopylist)

)#1-3 alist和deepcopylist中的不可變物件(int型別)id位址,位址一致

print(id

(alist[0]

))print(id

(deepcopylist[0]

))#1-4 alist和deepcopylist中的可變物件(list型別)id位址,位址不一致

print(id

(alist[1]

))print(id

(deepcopylist[1]

))#1-5 alist增加元素,deepcopylist並沒有增加元素

'straa'

)print

(f'alist:'

)#輸出alist:[10, [123, 345], 'straa']

print

(f'deepcopylist:'

)#輸出copylist:[10, [123, 345]]

#1-6 alist中不可變元素改變值,deepcopylist元素值沒有改變

alist[0]

=1print

(f'alist:'

)#輸出alist:[1, [123, 345], 'straa']

print

(f'deepcopylist:'

)#輸出copylist:[10, [123, 345]]

alist[1]

2222

)print

(f'alist:'

)#輸出alist:[1, [123, 345, 2222], 'straa']

print

(f'deepcopylist:'

)#輸出deepcopylist:[10, [123, 345]]

#2:深拷貝:不可變物件

#總結:

# 拷貝的是內容,由於是不可變物件,所以,拷貝出來的物件位址和原有位址是相同的。

# 如果原有物件改變了值,那麼變數所改變的位址也就改變了,拷貝物件還是指向原有位址,內容不會改變

bstr =

'abcde'

deepcopybstr = copy.deepcopy(bstr)

#1-1:bstr和deepcopybstr元素值

print

(f'bstr:'

)#輸出 bstr:abcde

print

(f'deepcopybstr:'

)#輸出 deepcopybstr:abcde

#1-2 bstr和deepcopybstr的id位址一致

print(id

(bstr)

)print(id

(deepcopybstr)

)#1-3

bstr =

'abcdef'

print

(f'bstr:'

)#輸出 bstr:abcdef

print

(f'deepcopybstr:'

)#輸出 deepcopybstr:abcde

3:按照上面執行的操作,可以看出來,不可變物件的深拷貝和淺拷貝沒有什麼區別,有區別的是可變物件,所以在進行操作的時候需要考慮好我們操作的物件是哪一種。

Python學習筆記 淺拷貝和深拷貝

淺拷貝 兩個指向的記憶體位址相同,指向同乙個記憶體 import copy 測試物件的淺拷貝和深拷貝 class mobilephone def init self,cpu,screen self.cpu cpu self.screen screen class cpu defcalculate s...

筆記 Python深拷貝和淺拷貝

a為已有容器,b作為a的拷貝 淺拷貝 a,b位址不同,a,b中元素的位址是相同的。淺拷貝的特點,只是將容器內的元素位址複製了乙份。如果修改a中的可變型別 a,b中對應元素的位址不變,內容保持一致 如果修改a中的不可變型別 a中對應元素的位址和內容會改變,a,b對應元素位址和內容不同 深拷貝 a,b位...

Python之深拷貝和淺拷貝

賦值,深拷貝和淺拷貝的區別?python中如何拷貝乙個物件?直接賦值 li1 li 只傳遞物件的引用,li1指向物件li的記憶體位址空間,因此,原有列表li改變,被賦值的li1也會做相應的改變.深拷貝 import copy,eg li3 copy.deepcopy li li和li3的記憶體位址不...