首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样
(1)、深拷贝:拷贝了一份与原对象不同地址的对象,修改对象中的任何值,都不会改变深拷贝的对象的值。
(2)、浅拷贝:对原对象值的拷贝,地址仍然指向原对象的地址,原对象的值发生变化,拷贝对象的值也会随着改变。
(3)、深拷贝和浅拷贝需要注意的地方是:可变元素的拷贝
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的地址是相同的。也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的指向同一个地址。
list1 = [[1, 2], 'feng', 66]
list2 = copy.copy(list1)
# 对象地址不同
print(id(list1)) # 14055210224
print(id(list2)) # 14055208953
# 里面的可变元素地址相同
print(id(list1[0])) # 14055249424
print(id(list2[0])) # 14055249424
下面解释可变类型和不可变类型的嵌套使用: