python中有乙個模組copy,deepcopy函式用於深拷貝,copy函式用於淺拷貝。
要理解淺拷貝,必須先弄清楚python中的引用。
python中一切都是物件,變數中存放的是物件的引用。
這是乙個普遍的法則。
能夠說 python 沒有賦值,僅僅有引用。
如。a=1,變數a僅僅是整數物件1的引用。
一、不可變物件
不可變物件包含:數字,字串,元組。
因為python中的變數存放的是物件引用。所以對於不可變物件而言,雖然
物件本身不可變
。但變數的物件引用是可變的。運用這種機制,有時候會讓人產生糊塗,似乎可變物件變化了。如以下的**:
i=73
i+=2
這裡的『=』表示引用。
從上面得知。
不可變的物件的特徵沒有變,依舊是不可變物件,變的僅僅是建立了新物件,改變了變數的物件引用。
二、可變物件
可變物件包含:列表、字典
其物件的內容是能夠變化的。
當物件的內容發生變化時。變數的物件引用是不會變化的。如以下的樣例。
m=[5,9]
m+=[6]
列表m的每乙個元素均是物件的引用。物件的生成。涉及到相應機制。如整形物件分為大整數物件和小整數物件,生成機制不同,這裡不作具體闡述。
函式的引數傳遞。本質上傳遞的是引用。
(1)沒有限制條件的分片表示式(l[:])可以複製序列
,但此法僅僅能淺層複製
。
(2)字典 copy 方法。d.copy() 可以複製字典,但此法僅僅能淺層複製
(3)有些內建函式。比如 list,可以生成拷貝 list(l)
(4)copy 標準庫模組可以生成完整拷貝:deepcopy,遞迴 copy
淺拷貝由copy模組中的copy()函式實現。簡單地說,
copy.copy 淺拷貝 僅僅拷貝父物件,不會拷貝物件的內部的可變
子物件。
詳細點說就是。
淺拷貝是指拷貝的僅僅是原物件元素的引用,換句話說,淺拷貝產生的物件本身是新的,可是它的內容不是新的,僅僅是對原
子物件的乙個
引用。
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
由id(alist)不等於id(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()函式實現,簡單地說。深拷貝 拷貝物件及其子物件。
乙個樣例展示引用、深拷貝與淺拷貝的不同。
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 淺拷貝與深拷貝
淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...