python基礎之深淺拷貝

深淺拷貝的作用:1、將原數據進行拷貝,對拷貝數據作修改,保留原數據。2、減少內存的使用。

不可變對象的深淺拷貝:沒有被拷貝的說法,即使拷貝,拷貝後的id一樣。數據不可變,拷貝後有啥用,對其重新賦值。

不可變對象:字符串,元組,數字

可變對象:列表,字典

一、不可變對象的深淺拷貝,例

>>> import copy
>>> string="hello,python"
>>> a=string
>>> b=copy.copy(string)
>>> c=copy.deepcopy(string)
>>> a
'hello,python'
>>> b
'hello,python'
>>> c
'hello,python'
>>> id(string)  #賦值,copy,deepcopy後的id和string的一樣
1449477519408
>>> id(a)
1449477519408
>>> id(b)
1449477519408
>>> id(c)
1449477519408
>>> import copy
>>> t=(1,2,3,4,5)
>>> a=t
>>> b=copy.copy(t)
>>> c=copy.deepcopy(t)
>>> a
(1, 2, 3, 4, 5)
>>> b
(1, 2, 3, 4, 5)
>>> c
(1, 2, 3, 4, 5)
>>> id(t)
2378949460832
>>> id(a)
2378949460832
>>> id(b)
2378949460832
>>> id(c)
2378949460832

二、可變對象的深淺拷貝

淺拷貝:只拷貝頂級對象

深拷貝:拷貝所有對象,頂級對象及其嵌套對象

例:

>>> import copy
>>> dict={"name":"wang han","age":19,"score":598}
>>> dict1=copy.copy(dict)        #淺拷貝
>>> dict2=copy.deepcopy(dict)    #深拷貝
>>> dict1
{'name': 'wang han', 'age': 19, 'score': 598}
>>> dict2
{'name': 'wang han', 'age': 19, 'score': 598}
>>> id(dict)                     #深淺拷貝後的id各不相同
2643939629888
>>> id(dict1)
2643939629672
>>> id(dict2)
2643940234512
#-------------------------------------------------------------------------------------------
>>> dict["score"]=500            #對原數據進行更改
>>> dict
{'name': 'wang han', 'age': 19, 'score': 500}  #原數據發生變化
>>> dict1
{'name': 'wang han', 'age': 19, 'score': 598}  #淺拷貝的數據並未發生變化
>>> dict2
{'name': 'wang han', 'age': 19, 'score': 598}  #深拷貝後的數據並未發生變化

例:

>>> a={"name":"majiandong","age":32,"gender":"boy","job":["hardware","software"]}
>>> b=copy.copy(a)                #淺拷貝
>>> c=copy.deepcopy(a)            #深拷貝 
>>> b
{'name': 'majiandong', 'age': 32, 'gender': 'boy', 'job': ['hardware', 'software']}
>>> c
{'name': 'majiandong', 'age': 32, 'gender': 'boy', 'job': ['hardware', 'software']}
>>> id(a)
48954752
>>> id(b)
48954536
>>> id(c)
49515112
#-----------------------------------------------------------------------------------------
>>> a["name"]="Qian Long"    #改變字典中的“name”
>>> a
{'name': 'Qian Long', 'age': 32, 'gender': 'boy', 'job': ['hardware', 'software']}
>>> b
{'name': 'majiandong', 'age': 32, 'gender': 'boy', 'job': ['hardware', 'software']}  #淺拷貝不受影響
>>> c
{'name': 'majiandong', 'age': 32, 'gender': 'boy', 'job': ['hardware', 'software']}  #深拷貝不受影響
#-----------------------------------------------------------------------------------------
>>> a["job"][0]="Sales"   #改變字典中嵌套對象"job"
>>> a
{'name': 'Qian Long', 'age': 32, 'gender': 'boy', 'job': ['Sales', 'software']}
>>> b
{'name': 'majiandong', 'age': 32, 'gender': 'boy', 'job': ['Sales', 'software']}  #淺拷貝受影響
>>> c
{'name': 'majiandong', 'age': 32, 'gender': 'boy', 'job': ['hardware', 'software']}  #深拷貝不受影響

 

  • 深淺拷貝都是對源對象的複製,佔用不同的內存空間
  • 如果源對象只有一級目錄的話,源做任何改動,不影響深淺拷貝對象
  • 如果源對象不止一級目錄的話,源對一級目錄改動,不影響深淺拷貝,源對二級目錄改動,影響淺拷貝,但不影響深拷貝
  • 序列對象的切片其實是淺拷貝,即只拷貝頂級的對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章