本文目錄一覽:
舉例區分Python中的淺複製與深複製
舉例區分Python中的淺複製與深複製
這篇文章主要介紹了舉例區分Python中的淺複製與深複製,是Python入門學習中的重要知識,需要的朋友可以參考下
copy模塊用於對象的拷貝操作。該模塊非常簡單,只提供了兩個主要的方法: copy.copy 與 copy.deepcopy ,分別表示淺複製與深複製。什麼是淺複製,什麼是深複製,網上有一卡車一卡車的資料,這裡不作詳細介紹。複製操作只對複合對象有效。用簡單的例子來分別介紹這兩個方法。
淺複製只複製對象本身,沒有複製該對象所引用的對象。
#coding=gbk
import copy
l1 = [1, 2, [3, 4]]
l2 = copy.copy(l1)
print l1
print l2
l2[2][0] = 50
print l1
print l2
#—- 結果 —-
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [50, 4]]
[1, 2, [50, 4]]
同樣的代碼,使用深複製,結果就不一樣:
import copy
l1 = [1, 2, [3, 4]]
l2 = copy.deepcopy(l1)
print l1
print l2
l2[2][0] = 50
print l1
print l2
#—- 結果 —-
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [50, 4]]
改變copy的默認行為
在定義類的時候,通過定義__copy__和__deepcopy__方法,可以改變copy的默認行為。下面是一個簡單的例子:
class CopyObj(object):
def __repr__(self):
return “CopyObj”
def __copy__(self):
return “Hello”
obj = CopyObj()
obj1 = copy.copy(obj)
print obj
print obj1
#—- 結果 —-
CopyObj
Hello
Python中的賦值,淺拷貝和深拷貝的區別
賦值(=),就是創建了對象的一個新的引用,修改其中任意一個變量都會影響到另一個。
淺拷貝:創建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數,如list();3,copy模塊的copy()函數}
深拷貝:創建一個新的對象,並且遞歸的複製它所包含的對象(修改其中一個,另外一個不會改變){copy模塊的deep.deepcopy()函數}
python深拷貝和淺拷貝的區別
淺拷貝是對一個對象父級(外層)的拷貝,並不會拷貝子級(內部),而深拷貝對一個對象是所有層次的拷貝(遞歸),內部和外部都會被拷貝過來。
使用淺拷貝的時候,分為兩種情況。
第一種,如果最外層的數據類型是可變的,比如說列表,字典等,淺拷貝會開啟新的地址空間去存放。
第二種,如果最外層的數據類型是不可變的,比如元組,字符串等,淺拷貝對象的時候,還是引用對象的地址空間。
深拷貝也分兩種情況:
第一種,最外層數據類型可變。這個時候,內部和外部的都會拷貝過來。
第二種,外層數據類型不可變,如果裡面是可變數據類型,會新開闢地址空間存放。如果內部數據類型不可變,才會如同淺拷貝一樣,是對地址的引用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/285595.html