简述
深拷贝和浅拷贝最根本的区别在于是否真正的获取了一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果发生变化,则说明是浅拷贝。
如果没有发生变化,则说明是深拷贝。
1.浅拷贝可以使用列表自带的copy()函数,或者使用类似于a = b[:]的方法。
2.深拷贝只能使用python的copy模块的deepcopy(),使用之前要导入(from copy import deepcopy)。
区别
列表中的引用:
一个列表里存储着另一个列表,存储的这个列表就是原来的列表的引用
1. 如果进行拷贝的列表里只有值,没有引用,则浅拷贝和深拷贝是一样的。
两者都是将原来的列表进行复制,产生一个新列表,如果对新列表进行修改,并不会影响原来的列表,两者是完全分离开的,内存地址也不一样。
使用代码来讲述:
给新创建的列表添加值,查看原列表的变化,列表的内存地址。
执行结果如下:
可以看到:
当对两者的新列表添加值后,原列表并没有发生变化,内存地址也不一样,表示两者已经完全分离开。
2. 如果拷贝的列表里有引用,则两者是不同的。
如果拷贝的列表里有引用,浅拷贝只是将原来的列表复制了一份,保留的依旧是原列表中的引用,对新列表中的引用进行修改,依然会修改原列表中的值,新列表与旧列表并没有完全分离开。
如果拷贝的列表里有引用,深拷贝就原列表中的引用也新建一个引用在新列表中,新列表中存放的是新创建的引用,这样就和原列表完全分离开了。
使用代码来讲述:
给新拷贝的列表中的引用添加值,查看原列表的变化,以及列表的内存地址和引用的内存地址。
执行结果如下:
可以看到:
当为浅拷贝时,原列表和新列表并没有完全分离开,对新列表的引用进行修改,导致了原列表的引用也发生了改变,并且两者引用的内存地址都一样。
当为深拷贝时,原列表和新列表完全分离开,对新列表的引用进行修改,不会使原列表的引用发生变化,两者的引用的内存地址不一样。