Python深拷貝淺拷貝

2021-10-11 23:48:14 字數 2175 閱讀 6045

python變數類似引用式變數,變數都是指向某塊位址。對於不可變物件,變數的改變相當於指向改變,直接換一塊記憶體,原記憶體位置的值是不變的。對於可變物件,變數改變相當於指向的那塊記憶體的值的改變。

對於int, float, bool, str, tuple等不可變物件,變數值的改變本質上是該引用變數指向的改變,而原來那塊記憶體的值是不變的。

>>

> a =

3>>

> b = a #二者同時引用一塊記憶體

>>

> a =

4#a指向其他記憶體了,b還沒變

>>

> b

3

def

swap

(a, b)

: a, b = b, a

>>

> a =

1>>

> b =

2>>

> swap(a, b)

>>

> a, b (1

,2)

函式不會修改作為引數的不可變物件

可變物件的改變為原記憶體處值的改變,對於乙個列表a,如果將其直接賦值給b則a與b同時引用乙個列表,一方改變,兩者同變:

>>

> a =[1

,2,3

]>>

> b = a

>>4)

>>

> a[1

,2,3

,4]

複製列表常用的list()構造方法和[:]淺拷貝,即僅拷貝了最外層容器,倘若列表中巢狀有可變物件則可變物件還是引用。例如:

>>

> a =[1

,2,3

,[4,

5]]>>

> b =

list

(a)#或者b = a[:] 一樣的

>>6)

>>

> b[1

,2,3

,[4,

5],6

]>>

> a[1

,2,3

,[4,

5]]#最外層容器拷貝

>>

> b[3]

6)>>

> a[1

,2,3

,[4,

5,6]

]#巢狀的可變物件還是引用

因此如果所有元素都是不可變的,用list()和[:]複製列表是沒問題的,還能節省記憶體,但如果有元素是可變物件就要警惕了,這些可變物件其實是引用。

python提供了深拷貝與淺拷貝的函式copy()deepcopy(),兩者可為任何物件做淺拷貝和深拷貝。

import copy

>>

> a =[1

,2,3

,[4,

5]]>>

> b = copy.copy(a)

#copy函式是淺拷貝

>>

> b[3]

6)>>

> a[1

,2,3

,[4,

5,6]

]>>

> c = copy.deepcopy(a)

#deepcopy函式是深拷貝

>>

> c[3]

7)>>

> c[1

,2,3

,[4,

5,6,

7]]>>

> a[1

,2,3

,[4,

5,6]

]

函式會修改作為引數傳入的可變物件。 例如:

def

f(a, b)

: a += b

return a

>>

> a =[1

,2]>>

> b =[3

,4]>>

> f(a, b)[1

,2,3

,4]>>

> a, b([

1,2,

3,4]

,[3,

4])

python 淺拷貝 深拷貝

直接賦值 其實就是物件的引用 別名 淺拷貝 copy 拷貝父物件,不會拷貝物件的內部的子物件。深拷貝 deepcopy copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。usr bin python import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物...

python深拷貝 淺拷貝

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 alist 1,2,3,...

python 深拷貝 淺拷貝

淺拷貝是對於乙個物件的頂層拷貝 通俗的理解是 拷貝了引用,並沒有拷貝內容 深拷貝是對於乙個物件所有層次的拷貝 遞迴 拷貝字典 值相當於鍵的引用 所以copy.copy 為淺拷貝 淺拷貝對不可變型別和可變型別的copy不同 copy.copy對於可變型別,會進行淺拷貝 copy.copy對於不可變型別...