通过一个简单的例子来理解深拷贝与浅拷贝:
例1:比如有如下一段代码:

普通的赋值操作就相当于浅拷贝,不会复制对象中的内容,只会将原有的内存地址赋值给新变量,这两个对象指向同一块内存地址,因此,两个对象的ID值是相同的。
例2:在上一代码基础上进行深拷贝操作

对nums进行深拷贝操作后,不论是外层对象,还是内层引用的对象,都会重新开辟一个新的内存空间,因此进行深拷贝后的ID值是不同的。
例3:对列表进行添加操作

例4:进行浅拷贝操作

当对象中的元素又引用了其他对象时,copy()方法只会对外层对象创建新的内存空间,内层引用不会开辟新的内存空间,依然使用原来的对象,因此当原列表进行添加操作后,会影响copy()方法创建出的对象。
例5:将nums的类型由列表变为元组

将nums变为元组后,deepcopy()方法仍会开辟新的内存空间,内层对象不会受原来对象变化的影响
例6:将例5中的deepcopy()换成copy()

网友评论