先看乙個例子
a =[1
,2,3
,4]b = a
a.pop(0)
print
(a)print
(b)
輸出:
[2,3,4]
[2,3,4]
a =[1
,2,3
,4]b = a.copy(
)a.pop(0)
print
(a)print
(b)
輸出
[2,3,4]
[1,2,3,4]
這種就是淺拷貝,拷貝的列表會單獨存在另一塊記憶體裡面,所以修改原列表中的元素不影響新列表中的元素
看另乙個例子
a =[[
1,2]
,2,3
]b = a.copy()a[
0].pop(0)
print
(a)print
(b)
輸出:
[
[2], 2, 3]
[[2], 2, 3]
為什麼我拷貝了原列表,新的列表還是隨著原列表改變而改變了?
細心的人會發現,這種改變是改變了列表中的子元素中的內容,而不是只改變了列表
淺拷貝只是將被拷貝的元素存在單獨一塊記憶體,但是不能將拷貝元素中的子元素還單獨存在一塊記憶體
下面我們用深拷貝:
import copy
a =[[1
,2],
2,3]
b = copy.deepcopy(a)a[0
].pop(0)
print
(a)print
(b)
輸出:
[
[2], 2, 3]
[[1, 2], 2, 3]
深拷貝不僅僅可以使被拷貝的物件存在單獨乙個位址中,而且被拷貝的子元素也單獨存在乙個位址中,是真正的完全拷貝
列表中的不可變物件如:數字,字串,元祖,這些使用深拷貝也會單獨分配一塊記憶體嗎?由於這些是不可變物件,我們無法使用改變記憶體中的值來看到效果,但是我們可以通過id()
這個函式來檢視判斷是否儲存在同一塊記憶體
import copy
a =[1,
2,3]
b = copy.deepcopy(a)
print(id
(a[0])
)print(id
(b[0])
)
輸出:
10914496
10914496
結果讓人大跌眼睛,這個和我們預想不一樣了
其實這是python內部做的優化,對於這些不可變物件,如果元素的值相同,python都會將他們儲存在同一塊記憶體以節約記憶體,因為這些是不可變物件,將他們存在同一塊記憶體不會導致改變乙個物件的值導致另乙個物件值的變化,所以可以將他們存在同一塊記憶體,這就是python中的inter機制
Python 淺拷貝與深拷貝
淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...
Python 淺拷貝與深拷貝
以下例項是使用 copy 模組的 copy.copy 淺拷貝 和 copy.deepcopy usr bin python coding utf 8 import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物件的引用 c copy.copy a 物件拷貝,淺拷貝 d copy....
python 深拷貝與淺拷貝
當乙個變數 的時候,約定為 指向位址的過程 如果copy.copy 拷貝的是元組,那麼它不會進行淺拷貝,僅僅是指向 因為元組是不可變資料型別,那麼意味著資料一定不能修改,因此用copy.copy的 時候它會自動判斷,是指向。如果,用copy.copy copy.deepcopy 對乙個全部是不可變型...