一入python深似海 淺拷貝與深拷貝

2021-09-09 04:21:11 字數 2814 閱讀 4299

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 ...