python基礎之深淺拷貝
阿新 • • 發佈:2018-12-08
深淺拷貝的作用: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']} #深拷貝不受影響
- 深淺拷貝都是對源物件的複製,佔用不同的記憶體空間
- 如果源物件只有一級目錄的話,源做任何改動,不影響深淺拷貝物件
- 如果源物件不止一級目錄的話,源對一級目錄改動,不影響深淺拷貝,源對二級目錄改動,影響淺拷貝,但不影響深拷貝
- 序列物件的切片其實是淺拷貝,即只拷貝頂級的物件