拷贝分为:
赋值,浅拷贝,深拷贝,拷贝程度一次递增
赋值:
赋值就是相当于做了个软连接,所以不管你是修改了链接文联的内容还是源文件的内容,这个文件都会有所改变(相当于镜子里的自己,你动他也动).
浅拷贝:
只是做了部分的拷贝,何谓部分拷贝?就是在赋值的基础上减去了列表最外层的链接,其他的和赋值基本一样,下面例子会有说明.
深拷贝:
相当于把文件复制了一份,新文件或老文件的改变都是互不相干的,完全独立于老文件.
1.先从id来分析:
import copy
a = [1,2,3,[4,5,6,[7,8,9]]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
print('查看每个变量的id')
print(id(a))
print(id(b))
print(id(c))
print(id(d))
有上面的结果可以得出,赋值的id是和原来的id是一样的,赋值只是把指针指向了列表a
深拷贝和浅拷贝的id是不一样的,由此看出,深浅拷贝是分别独立开辟出了一个内存空间了
查看每个元素的id:
import copy
a = [1,2,3,[4,5]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
for p in [a,b,c,d]:
print('*' * 50)
for i in p:
print('这个是%s 的id %s'%(i,id(i)))
if type(i) == list:
for j in i:
print('这个是%s 的id %s' % (j, id(j)))
************************************************** 这个是1 的id 1545667024 这个是2 的id 1545667056 这个是3 的id 1545667088 这个是[4, 5] 的id 2309705018824 这个是4 的id 1545667120 这个是5 的id 1545667152 ************************************************** 这个是1 的id 1545667024 这个是2 的id 1545667056 这个是3 的id 1545667088 这个是[4, 5] 的id 2309705018824 这个是4 的id 1545667120 这个是5 的id 1545667152 ************************************************** 这个是1 的id 1545667024 这个是2 的id 1545667056 这个是3 的id 1545667088 这个是[4, 5] 的id 2309705018824 这个是4 的id 1545667120 这个是5 的id 1545667152 ************************************************** 这个是1 的id 1545667024 这个是2 的id 1545667056 这个是3 的id 1545667088 这个是[4, 5] 的id 2309705019208 这个是4 的id 1545667120 这个是5 的id 1545667152
由此可以看出每个最小的元素,的id都是一样的,
赋值和浅拷贝的id也是一样的,值有深拷贝里面的列表元素是不一样的,
2.在列表中增加元素来看看效果:
①赋值和原列表的比较
import copy
a = [1,2,3,[4,5,6,[7,8,9]]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
print('这个是最初的列表')
a.append('aaa')
a[3].append('aaa')
a[3][3].append('aaa')
print('原列表a',a)
print('这个是赋值')
b.append('bbb')
b[3].append('bbb')
b[3][3].append('bbb')
print('原列表a',a)
print('赋值列表b',b)
所以赋值列表,无论是原列表增加还是赋值列表增加都会增加
②.浅拷贝和原列表的比较:
import copy
a = [1,2,3,[4,5,6,[7,8,9]]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
print('这个是最初的列表')
a.append('aaa')
a[3].append('aaa')
a[3][3].append('aaa')
print('原列表a',a)
print('这个是浅拷贝')
c.append('ccc')
c[3].append('ccc')
c[3][3].append('ccc')
print('原列表a',a)
print('浅拷贝列表c',c)
由此可得出的结论是浅拷贝和原列表深层元素相当于赋值,最外层元素,相当于深拷贝,浅拷贝是赋值和深拷贝的中间产物
③.深拷贝和原列表的比较:
有上面的例子得出,深拷贝和浅拷贝是互不相关的,各自都对对方没有影响!
转载于:https://blog.51cto.com/853056088/2156686