浅拷贝 : 只复制对象的基本类型,对象类型,仍属于原来的引用.(影子克隆)
深拷贝 : 不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.(深度克隆)
浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象
如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化
深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的
浅拷贝(Copy)只是增加了一个指针指向已存在的内存地址
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存
在python深浅拷贝的区别:
copy(浅拷贝):
1、复制不可变数据类型(int、string、tuple)的时候,无论是copy(浅拷贝)、deepcopy(深拷贝)或者“=” 的地址都与原对象id地址一样
例:
import copy
a = "你好"
b = a
c=copy.copy(a) #浅拷贝
d=copy.deepcopy(a) #深拷贝
print("a的原地址",id(a))
print("a的赋值地址b",id(b))
print("a的浅拷贝的地址c",id(c))
print("a的深拷贝的地址d",id(d))
输出的结果:
a的原地址 2187140851120
a的赋值地址b 2187140851120
a的浅拷贝的地址c 2187140851120
a的深拷贝的地址d 2187140851120
deepcopy(深拷贝):
2、深拷贝是拷贝了原始对象的值并开辟了新的内存地址,新对象与原始对象是完全独立,包括内层和外层列表,原对象的值的改变不会引起新对象的值的改变
例:
import copy
list = [1, 2,[3, 4]]
b =copy.deepcopy(list1)
print("修改前的list1:",list1)
print("list1原地址:",id(list1))
print("list1深拷贝地址b:",id(b))
print("===修改原对象的值===")
list1[2][0] = 5
print("修改后的list1:",id(list1))
print("list1修改后的地址:"id(list1))
print("修改后的list1,深拷贝的a:",b)
print("list1修改后的深拷贝地址a:",id(b))
输出的结果:
修改前的list1: [1, 2, [3, 4]]
list1原地址: 2264317151424
list1深拷贝地址b: 2264319363456
===修改原对象的值===
修改后的list1: 2264317151424
list1修改后的地址: 2264317151424
修改后的list1,深拷贝的a: [1, 2, [3, 4]]
list1修改后的深拷贝地址a: 2264319363456