浅拷贝 : 只复制对象的基本类型,对象类型,仍属于原来的引用.(影子克隆)

深拷贝 : 不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.(深度克隆)

 

浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象

如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化

深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的

 

浅拷贝(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