关于深浅拷贝的测试

拷贝也就是复制,是为了对一个对象的备份使用,python中拷贝分为深拷贝和浅拷贝

==深拷贝== 深拷贝是递归的方式对对象的所有层次的拷贝 简单来说就是将一个对象完整的拷贝下来,包括内部构造的列表等等

==浅拷贝== 浅拷贝是对拷贝对象的顶层拷贝,即只拷贝了引用,不拷贝内容 简单来说,浅拷贝就是只拷贝外壳,对于内部的变化不做要求,所以原内容改变,会影响到拷贝的结果

##### 浅拷贝:copy.copy:只拷贝一层,如果是列表存列表,对列表中的列表改变也会影响拷贝列表
##### 深拷贝:copy.deepcopy: 拷贝所有,从内到外,在内存中重新开辟一个空间存储拷贝的内容,彼此不再相互影响
```
import copy

(一)
ls = ['a','b','c']
# 浅 拷贝的列表与原列表的地址不同,是在内存空间新开辟的空间进行的存储
ls1 = copy.copy(ls)
print(ls1,id(ls1),id(ls))

# 深 拷贝的列表与原列表地址相同,即使用的是同一个对象,但是指向了不同的变量
ls2 = copy.deepcopy(ls)
print(ls2,id(ls2),id(ls))


(二)
c = [a,b]
d = copy.deepcopy(c)
e = copy.copy(c)
print(id(c),id(d),id(e))
### 48622048 48622008 48621928 ###
# 此时分别进行了深拷贝与浅拷贝,但是三者的地址都不同

上面两个例子,我们可以假设深拷贝对于递归内容要求是全部不可变,不可变就不会改变地址,有可变元素就会改变原始的地址
下面是测试:

(三)
ls = [(1, 2, 3), '8']
ls1 = copy.copy(ls)
ls2 = copy.deepcopy(ls)

print(id(ls),id(ls1),id(ls2))
### 47769080 47769320 47770080 ###

ls = [[1, 2, 3], '8']
ls1 = copy.copy(ls)
ls2 = copy.deepcopy(ls)

print(id(ls),id(ls1),id(ls2))
### 47244992 47245752 47245712 ###

观察上面两个列表的拷贝情况,当元素不可变时,深拷贝就会使用源地址
```

#### 需要注意的是:两者拷贝出来得到的对象都可以进行使用且不会影响原来的对象,但是当原对象改变时,浅拷贝会随之改变,深拷贝则不会

原文地址:https://www.cnblogs.com/Zhao01/p/10083283.html