python深拷貝 淺拷貝

2021-09-24 10:42:14 字數 1935 閱讀 7551

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用

一般有三種方法,

alist=[1,2,3,['a','b']]

(1)直接賦值,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變

>>> alist=[1,2,3,['a','b']]

>>> b=alist

>>> print b

[1, 2, 3, ['a', 'b']]

>>> print alist;print b

[1, 2, 3, ['a', 'b'], 5]

[1, 2, 3, ['a', 'b'], 5]

(2)copy淺拷貝,沒有拷貝子物件,所以原始資料改變,子物件會改變

目前alist=[1, 2, 3, ['a', 'b'], 5]

>>> import copy

>>> c=copy.copy(alist)

>>> print alist

[1, 2, 3, ['a', 'b'], 5]

>>> print c

[1, 2, 3, ['a', 'b'], 5]

>>> print alist;print c

[1, 2, 3, ['a', 'b'], 5, 6]

[1, 2, 3, ['a', 'b'], 5]

>>> print alist;print c

[1, 2, 3, ['a', 'b'], 5, 6, 'python']

[1, 2, 3, ['a', 'b'], 5]

>>> alist[3]

['a', 'b']

>>> print alist;print c

[1, 2, 3, ['a', 'b', 'python'], 5, 6, 'python']

[1, 2, 3, ['a', 'b', 'python'], 5]

(3)深拷貝,包含物件裡面的子物件的拷貝,所以原始物件的改變不會造成深拷貝裡任何子元素的改變

>>> import copy

>>> alist=[1,2,3,['a','b']]

>>> d=copy.deepcopy(alist)

>>> print alist;print d

[1, 2, 3, ['a', 'b']]

[1, 2, 3, ['a', 'b']]

>>> print alist;print d

[1, 2, 3, ['a', 'b'], 5]

[1, 2, 3, ['a', 'b']]

>>> alist=[1,2,3,['a','b']]

>>> alist[3]

['a', 'b']

>>> print alist;print d

[1, 2, 3, ['a', 'b', 'python']]

[1, 2, 3, ['a', 'b']]

總結:

1. 賦值是將乙個物件的位址賦值給乙個變數,讓變數指向該位址( 舊瓶裝舊酒 )。

2. 淺拷貝是在另一塊位址中建立乙個新的變數或容器,但是容器內的元素的位址均是源物件的元素的位址的拷貝。也就是說新的容器中指向了舊的元素( 新瓶裝舊酒 )。

3. 深拷貝是在另一塊位址中建立乙個新的變數或容器,同時容器內的元素的位址也是新開闢的,僅僅是值相同而已,是完全的副本。也就是說( 新瓶裝新酒 )。

python 淺拷貝 深拷貝

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

python 深拷貝 淺拷貝

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

python 深拷貝 淺拷貝

1.b a只是引用傳遞 2.copy.copy 產生了新的引用,但是淺複製,指向的是同乙個物件 3 c a,b 只是傳遞了引用 4 copy.deepcopy 如果列表裡面的都是引用型別,則是深拷貝 如果列表中的元素是基本型別,則deepcopy也相當於淺拷貝 5.理解下面的原因 6.元組本身是不可...