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']}  #深拷贝不受影响
  • 深浅拷贝都是对源对象的复制,占用不同的内存空间
  • 如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
  • 如果源对象不止一级目录的话,源对一级目录改动,不影响深浅拷贝,源对二级目录改动,影响浅拷贝,但不影响深拷贝
  • 序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

猜你喜欢

转载自blog.csdn.net/Panda996/article/details/84839601