python中【賦值】、【淺複製】、【深複製】的區別

python中【賦值】、【淺複製】、【深複製】的區別

相信很多同學是學到“淺複製”(淺拷貝)及“深複製”(深拷貝)這兩個概念纔來看本篇文章的,那我們不妨通過本篇文章來徹底的瞭解一下python中【賦值】、【淺複製】、【深複製】的區別。

1.賦值
【賦值】這個概念在學習python之初就已經很瞭解了,我們每每定義一個變量,都會給它進行【賦值】,那我們先看一下【賦值】的一些用法:

str1 = 'hopes'
print(type(str1))
print(str1)

結果:

<class 'str'>
hopes

我們首先定義了一個字符串變量,它的內容是"hopes",那接下來我們把‘str1’賦值給另一個字符串變量:

str1 = 'hopes'
str2 = str1

print(str1)
print(str2)

結果:

hopes
hopes

感覺這個【賦值】的效果跟【複製】是一樣的,是真的一樣嗎?再體驗下面的代碼:

str1 = 'hopes'
str2 = str1

str1 = 'Li'

print(id(str1))
print(str1)

print(id(str2))
print(str2)

結果:

4309512688
Li

4309512368
hopes

看來確實是我們想要的【複製】效果,當我們定義‘str1’的時候,系統分配給了‘str1’一個內存空間,然後我們‘str1’賦值給‘str2’後,系統同樣給‘str2’分配了一個內存空間,並且從此以後,‘str1’和‘str2’不再有任何關係,‘str1’無論怎樣改變,都和‘str2’沒有任何關係;所以【賦值】我們也可以將它看作是【複製】的一種。

2.淺複製
說完【賦值】,我們再聊一下【淺複製】,"淺"是深淺的淺,是淺層次的【複製】,那它的效果是怎樣的呢?我們同樣通過代碼來觀察:

import copy
list1 = [1,2,3,[1,2]]
list2 = copy.copy(list1)

print(list1)
print(list2)

list1.append(4)
print(list1)
print(list2)

結果:

[1, 2, 3, [1, 2]]
[1, 2, 3, [1, 2]]

[1, 2, 3, [1, 2], 4]
[1, 2, 3, [1, 2]]

觀察效果後,感覺和直接【賦值】的方法是差不多的,我們將‘list1’【複製】給‘list2’之後,雖然改變了‘list1’的元素,但是‘list2’卻沒受影響;好,我們再看下一段代碼,我們進行“深”一些的改變:

import copy
list1 = [1,2,3,[1,2]]
list2 = copy.copy(list1)

list1[3].append(4)
print(list1)
print(list2)

結果:

[1, 2, 3, [1, 2, 4]]
[1, 2, 3, [1, 2, 4]]

這裏的結果就感覺不對了吧,很明顯的看出,我們改變了更深一些的‘list1’裏面的列表,從而也使‘list2’收到影響了,按理說【複製】之後他們兩個應該互不影響纔對嗎?所以這個複製效果就是【淺複製】的性質;我們不妨看一下通過copy方法是否給‘list2’也分配內存空間了呢?

import copy
list1 = [1,2,3,[1,2,3]]
list2 = copy.copy(list1)   #淺複製

print(id(list1))
print(id(list2))

結果:

4489966400
4490147392

沒問題,‘list1’和‘list2’都被分配了一個內存空間;以下三個方法都相當於【淺複製】:
1.使用切片[:]操作
2.使用工廠函數(如list/dir/set)
3.使用copy模塊中的copy()函數

3.深複製
如果我們理解【淺複製】爲:只是複製了淺層次的數據,更深層次的數據如果被修改,那麼還是會受到影響的話,那麼我們再看一下【深複製】有着怎樣的效果:

import copy
list1 = [1,2,3,[1,2]]
list2 = copy.deepcopy(list1)    #深複製

print(list1)
print(list2)

list1.append(4)
print(list1)
print(list2)

結果:

[1, 2, 3, [1, 2]]
[1, 2, 3, [1, 2]]
[1, 2, 3, [1, 2], 4]
[1, 2, 3, [1, 2]]

從上面的效果可以看出,在只修改淺層次的數據時,【深複製】和【淺複製】的效果是一樣的,‘list2’均不會受到影響,那我們改一下深層次的數據試一下:

import copy
list1 = [1,2,3,[1,2]]
list2 = copy.deepcopy(list1)

list1[3].append(4)
print(list1)
print(list2)

結果:

[1, 2, 3, [1, 2, 4]]
[1, 2, 3, [1, 2]]

發現什麼了嗎?即使對‘list1’內部的列表進行更改,‘list2’還是不會受到影響;那我如果再深層次的改一下數據呢?

import copy
list1 = [1,2,3,[1,2,[2,3]]]
list2 = copy.deepcopy(list1)

list1[3][2].append(4)
print(list1)
print(list2)

結果:

[1, 2, 3, [1, 2, [2, 3, 4]]]
[1, 2, 3, [1, 2, [2, 3]]]

結果同樣是沒問題的,無論改多麼深的數據,‘list2’都不會受到‘list1’的影響;【淺複製】和【深複製】的區別就是這麼簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章