對python淺拷貝和深拷貝的完整認識

2021-10-02 16:56:56 字數 2030 閱讀 7914

這是在介紹本文內容時,要了解的知識。

太乾吧了,來點**滋潤下。

>>> a = [1,2,3,4]

>>> b = a

>>> a[0] = 3

>>> print(a)

[3, 2, 3, 4]

>>> print(b)

[3, 2, 3, 4]

這樣往往會與你使用b = a這個預想的效果產生偏差,因為列表是個可變物件,物件在所指的記憶體中直接發生改變。會讓操作變得尷尬。

python是動態解釋性語言,所以建立變數的方式會有所不同。

變數:是系統變數名錶中的元素

物件:則是計算機分配的一塊記憶體

>>> id(2)

140718258312256

>>> a = 2

>>> id(a)

140718258312256

>>> b = 2

>>> id(2)

140718258312256

感受一下

再來一張圖可以加深你的理解

這樣我們就大概的了接了什麼是可變物件和不可變物件。

為什麼要用到拷貝呢?上面**上的例子我們可以看出為了不想對原物件產生***。也就是讓b指向原來a的物件,但是可以修改a的時候讓b不受到影響。

拷貝引入了python中的copy模組

淺拷貝:copy.copy()      呼叫物件的拷貝:list.copy()       對列表切片的拷貝:m[ : ]

深拷貝:copy.deepcopy()

來點**,看看對比

淺拷貝 

拷貝可變物件時 :拷貝外面的外殼,裡面的元素不拷貝

>>> import copy

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

>>> b = a

>>> c = copy.copy(a)

>>> print(a)

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

>>> print(b)

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

>>> print(c)

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

>>> print(a)

[1, 2, 3, 4, ['a', 'b', 'c', 'd']]

>>> print(id(a),id(b),id(c))

2104758109576 2104758109576 2104755888008

深拷貝

拷貝可變物件時:外殼和裡面的元素都拷貝

拷貝不可變物件時:拷貝新物件

>>> import copy

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

>>> b = a

>>> c = copy.deepcopy(a)

>>> print(a)

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

>>> print(b)

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

>>> print(c)

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

>>> print(id(a),id(b),id(c))

2104755887880 2104755887880 2104758109576

對比之後我們發現

淺拷貝中如果原物件中的list改變,將會影響到改變的物件,當然當你改變改變後物件的list,那麼原物件也會因此受到影響。(總之淺拷貝與原物件之間還是有一些藕斷絲連的感覺)

深拷貝中完全與原物件沒有關係。

所以在我們使用python的時候,複製都會採取深拷貝。

see you !!!

python 深拷貝 Python深拷貝和淺拷貝!

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

Python 深拷貝和淺拷貝

淺拷貝只拷貝了引用,並沒有拷貝內容,相當於把原來的引用複製了乙份給新的變數 深拷貝是將原來的值複製了乙份到新的地方 in 30 a 1,2,3 in 31 b a in 32 id a out 32 140618626865352 in 33 id b out 33 140618626865352 ...

python深拷貝和淺拷貝

copy.copy 淺拷貝 只拷貝父物件,不會拷貝物件的內部的子物件。比深拷貝更加節省記憶體 copy.deepcopy 深拷貝 拷貝物件及其子物件 用乙個簡單的例子說明如下 import copy公升 a 1,2,3,4,a b c b a c copy.copy a d copy.deepcop...