拷贝分为:

赋值,浅拷贝,深拷贝,拷贝程度一次递增

    赋值:

        赋值就是相当于做了个软连接,所以不管你是修改了链接文联的内容还是源文件的内容,这个文件都会有所改变(相当于镜子里的自己,你动他也动).

    浅拷贝:

        只是做了部分的拷贝,何谓部分拷贝?就是在赋值的基础上减去了列表最外层的链接,其他的和赋值基本一样,下面例子会有说明.

    深拷贝:

        相当于把文件复制了一份,新文件或老文件的改变都是互不相干的,完全独立于老文件.


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)

从容器中拷贝出来的东西为空_浅拷贝_02

所以赋值列表,无论是原列表增加还是赋值列表增加都会增加

②.浅拷贝和原列表的比较:

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)

从容器中拷贝出来的东西为空_浅拷贝_03

由此可得出的结论是浅拷贝和原列表深层元素相当于赋值,最外层元素,相当于深拷贝,浅拷贝是赋值和深拷贝的中间产物


③.深拷贝和原列表的比较:

从容器中拷贝出来的东西为空_赋值_04

有上面的例子得出,深拷贝和浅拷贝是互不相关的,各自都对对方没有影响!



转载于:https://blog.51cto.com/853056088/2156686