面試題 python3中 深拷貝和淺拷貝快速理解

2021-09-25 22:00:23 字數 2369 閱讀 6700

目錄

淺拷貝在不可變資料型別(元組tuple,字串string,整數型int,浮點數型float)使用淺拷貝,**如下:

可變資料型別(列表list,字典dict),**如下:

使用內建函式copy()進行淺拷貝,**如下:

深拷貝使用copy模組中的deepcopy(),**如下: 總結

淺拷貝和深拷貝的區別:

copy函式僅僅copy第一層(淺拷貝。)

如果使用元組型別(不可變型別),copy那麼就是淺拷貝。

copy根據不同資料型別來進行不同的處理。

整數型別

>>> 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')

當 把12複製給a的時候  b = 12,這個時候 a和b的值都是12,但是重新將b賦值為24時候 b =24 ,a =12。為啥a沒變變化呢。所以這個時候簡單理解是python直譯器裡把記憶體裡的a的引用指向了給b,只是引用,而非真正的值賦值給a,所以b的值更改不會影響到a的值。所以其他同理。

面試回答:淺拷貝就是只是在記憶體中使用你獲取的引用,而非引用自身值。

列表

('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

>>> y = x.copy()

>>> y

>>> y['username'] = 'tom'

>>> y['gender'] = 'female'

>>> y

>>> x

此**中,當把x字典copy給y時候,y字典中修改鍵username和gender時候返回值僅僅只是更改了y的值,而x值一點沒變。所以這個方法執行的是淺複製,因為值本身是原件,而非副本。

>>> from copy import deepcopy

>>> d = {}

>>> d['name'] = ['alen', 'tom']

>>> d

>>> c = d.copy()

>>> c

>>> d_c = deepcopy(d)>>> d

>>> d_c

此**中關鍵點是將d中深拷貝到d_c後,修改d的值時候發現 d的值改變了增加了jack,而深拷貝中的d_c值一點沒變。所以這個時候深拷貝中d_c是把d在記憶體位址裡的值全部都拷貝過來了,建立全新的記憶體位址d_c而非引用,所以修改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...