python中有乙個模組copy,deepcopy函式用於深拷貝,copy函式用於淺拷貝。
要理解淺拷貝,必須先弄清楚python中的引用。
python中一切都是物件,變數中存放的是物件的引用。
這是乙個普遍的法則。
能夠說 python 沒有賦值,僅僅有引用。
如。a=1,變數a僅僅是整數物件1的引用。
一、不可變物件
不可變物件包含:數字,字串,元組。
因為python中的變數存放的是物件引用。所以對於不可變物件而言,雖然
物件本身不可變
。但變數的物件引用是可變的。運用這種機制,有時候會讓人產生糊塗,似乎可變物件變化了。如以下的**:
這裡的『=』表示引用。i=73
i+=2
從上面得知。
不可變的物件的特徵沒有變,依舊是不可變物件,變的僅僅是建立了新物件,改變了變數的物件引用。
二、可變物件
可變物件包含:列表、字典
其物件的內容是能夠變化的。
當物件的內容發生變化時。變數的物件引用是不會變化的。如以下的樣例。
列表m的每乙個元素均是物件的引用。物件的生成。涉及到相應機制。如整形物件分為大整數物件和小整數物件,生成機制不同,這裡不作具體闡述。m=[5,9]
m+=[6]
函式的引數傳遞。本質上傳遞的是引用。
(1)沒有限制條件的分片表示式(l[:])可以複製序列
,但此法僅僅能淺層複製
。
(2)字典 copy 方法。d.copy() 可以複製字典,但此法僅僅能淺層複製
(3)有些內建函式。比如 list,可以生成拷貝 list(l)
(4)copy 標準庫模組可以生成完整拷貝:deepcopy,遞迴 copy
淺拷貝由copy模組中的copy()函式實現。簡單地說,
copy.copy 淺拷貝 僅僅拷貝父物件,不會拷貝物件的內部的可變
子物件。
詳細點說就是。
淺拷貝是指拷貝的僅僅是原物件元素的引用,換句話說,淺拷貝產生的物件本身是新的,可是它的內容不是新的,僅僅是對原
子物件的乙個
引用。
由id(alist)不等於id(blist),表明淺拷貝產生的物件本身是新的。可是它的子物件(即,那個列表)是對原子物件的乙個引用。import copy
alist=[[1,2],3,4]
blist=copy.copy(alist)
print alist
print blist
print id(alist)
print id(blist)
alist[0][0]=5
print alist
print blist
那麼3,4兩個元素呢?這就要講講python中的可變物件和不可變物件的引用了。
可是有點須要特別提醒的,
假設物件本身是不可變的,那麼淺拷貝時也是引用。
見這個樣例:
總結,即import copy
alist=[[1,2],3,4]
blist=copy.copy(alist)
print alist
print blist
print id(alist[1])
print id(blist[1])
alist[2]=5#變數的物件引用改變了而已
alist[0]=[0,1,1]#變數的物件引用改變了而已
print alist
print blist
淺拷貝產生的物件本身是新的。可是它的內容不是新的,
僅僅是對原
子物件
的乙個
引用
。淺拷貝由copy模組中的deepcopy()函式實現,簡單地說。深拷貝 拷貝物件及其子物件。
乙個樣例展示引用、深拷貝與淺拷貝的不同。
事實上我認為記住這一點即可,淺拷貝產生的物件本身是新的,可是它的內容不是新的。僅僅是對原子物件的乙個引用。關鍵是要理解python中引用的含義。import copy
alist=[[1,2],3,4]
blist=alist
clist=copy.copy(alist)
dlist=copy.deepcopy(alist)
print alist
print blist
print clist
print dlist
print id(alist)
print id(blist)
print id(clist)
print id(dlist)
print alist
print blist
print clist
print dlist
一入電商深似海
這幾年身邊經常有同事或朋友想做電商 有想開 小店的,有實體廠家想入駐天貓的,經常來諮詢我的意見。我對他們的回覆都是 不要輕易嘗試,這裡水很深。很多人不理解,我就說你先弄清楚三個問題 你對電商真實環境了解多少?你打算投入多少資金?你的產品有什麼優勢?備註 很多人所謂的電商就是指 所以本文也以 系來代表...
一入python深似海 物件的屬性
python中一切皆是物件,每乙個物件都能夠有多個屬性。python是怎樣管理這些屬性呢?我們來 一下。物件的屬性包括兩部分 類屬性和 物件屬性。物件的屬性可能來自於其類的定義,叫做類屬性。類屬性可能來自於類的定義自身,也可能來自父類。乙個物件的屬性還可能是該物件例項定義的,叫做物件屬性。物件的屬性...
Python 淺拷貝與深拷貝
淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...