目錄
淺拷貝在不可變資料型別(元組tuple,字串string,整數型int,浮點數型float)使用淺拷貝,**如下:
可變資料型別(列表list,字典dict),**如下:
使用內建函式copy()進行淺拷貝,**如下:
深拷貝使用copy模組中的deepcopy(),**如下: 總結
淺拷貝和深拷貝的區別:
copy函式僅僅copy第一層(淺拷貝。)
如果使用元組型別(不可變型別),copy那麼就是淺拷貝。
copy根據不同資料型別來進行不同的處理。
整數型別當 把12複製給a的時候 b = 12,這個時候 a和b的值都是12,但是重新將b賦值為24時候 b =24 ,a =12。為啥a沒變變化呢。所以這個時候簡單理解是python直譯器裡把記憶體裡的a的引用指向了給b,只是引用,而非真正的值賦值給a,所以b的值更改不會影響到a的值。所以其他同理。>>> a = 12
>>> b = a
>>> a
12>>> b
12>>> b = 24
>>> b
24>>> a
12浮點數型別
>>> a = 3.14
>>> b = a
>>> b
3.14
>>> b = 13.13
>>> b
13.13
>>> a
3.14
元組
>>> a =('a','b','c')
>>> a
('a', 'b', 'c')
>>> b = a
>>> b
('a', 'b', 'c')
>>> a
('a', 'b', 'c')
>>> b = ('name','age','gender')
>>> b
('name', 'age', 'gender')
>>> a
('a', 'b', 'c')
面試回答:淺拷貝就是只是在記憶體中使用你獲取的引用,而非引用自身值。
列表原理同上。('a', 'b', 'c')
>>> a = [1,2,3]
>>> b =a
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> a
[1, 2, 3]
>>> a= [1,2,3]
>>> b = a
>>> b
[1, 2, 3]
>>> b = ['name','age','gender']
>>> b
['name', 'age', 'gender']
>>> a
[1, 2, 3]
>>> x此**中,當把x字典copy給y時候,y字典中修改鍵username和gender時候返回值僅僅只是更改了y的值,而x值一點沒變。所以這個方法執行的是淺複製,因為值本身是原件,而非副本。>>> y = x.copy()
>>> y
>>> y['username'] = 'tom'
>>> y['gender'] = 'female'
>>> y
>>> x
>>> from copy import deepcopy此**中關鍵點是將d中深拷貝到d_c後,修改d的值時候發現 d的值改變了增加了jack,而深拷貝中的d_c值一點沒變。所以這個時候深拷貝中d_c是把d在記憶體位址裡的值全部都拷貝過來了,建立全新的記憶體位址d_c而非引用,所以修改d的值時候只是會改變d本身的值。而不會變改變d_c的值。>>> d = {}
>>> d['name'] = ['alen', 'tom']
>>> d
>>> c = d.copy()
>>> c
>>> d_c = deepcopy(d)>>> d
>>> d_c
deepcopy函式中還有其他引用繼續拷貝。(僅限可變型別list(列表))
python面試題 深拷貝與淺拷貝
1.賦值拷貝 2.copy淺拷貝 3.deepcopy深拷貝 import copya 1,2,3,4 賦值拷貝,預設淺拷貝,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 b a5 print a,adress id a 1,2,3,4 5 adress 2670537167752 ...
Python3之淺拷貝和深拷貝
python中賦值語句不複製物件,而是在目標和物件之間建立繫結 bindings 關係。python3中有6種標準的資料型別,可分為可變型別和不可變型別。可變型別 list 列表 dictionary 字典 set 集合 不可變型別 number 數字 string 字串 tuple 元組 淺拷貝由...
Python3的深拷貝和淺拷貝
a 1 b a a 2 print a,b print id a id b 執行結果 2 11445293568 1445293536 列表直接復賦值給列表不屬於拷貝,只是記憶體位址的引用 list1 a b c list2 list1 print list1,list2 print id list...