深浅拷贝的区别
如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是
否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那
就是深拷贝,自食其力。
可变对象,不可变对象
可变对象:一个对象在不改变其所指向的地址前提下,可以修改其所执行的地址中的值
不可变对象:一个对象所指向的地址上的值是不能修改的,如果修改了就是它执行的地址就改变了,相当于将这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了。
区别:可变对象就不会这样会修改值后另存到一个新的地址上,而是直接再原对象的地址上把值给改变了,这个对象依然执行这个地址
本质区别:可变对象修改了值,不会新建一个内存地址的对象,不可变对象如果修改了值,及时复制了一份新的内存地址,原始地址的值不会被改变
- 如果是基本数据类型,名字和值都会储存在栈内存中
当然,这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据
- 如果是引用数据类型,名字存在栈内存中,值存在堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值
1.1.2.浅拷贝
浅拷贝:创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。 如果属性是基本类型,拷贝的就是基本类型的值。 如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象
缺点: 浅拷贝只能实现一层的拷贝,无法进行深层次的拷贝
图形原理
深拷贝
深拷贝:对原对象的地址的拷贝,新拷贝了一份与原对象不同的地址的对象,修改对象中的任何值,都不会改变深拷贝的对象的值。
深拷贝(深度克隆):不仅复制对象的基本类,同时也复制原对象的对象,完全是新对象产生的
copy.deepcopy 深拷贝——拷贝对象的值类型,还拷贝了原始对象,而产生了一个新的对象,不仅仅只拷贝了原始对象的引用 如图:每一层创建的都是新的内存地址
缺点: 无法实现对对象中 方法 的拷贝,会显示为undefined
图形原理
实现原理
浅拷贝实现原理
在引用数据类型中,一个引用数据把值赋给另一个引用数据类型,仅仅只是在栈中将引用的地址复制一遍,在栈中在开辟一个内存,存放一个相同的地址而已,但是并没有在堆中对应地开辟一块内存用来存放新的值。这就出现了两个地址指向同一块堆中的值,其实就是同一个值,无论是哪一有变动,两个取到的值都只
是改变过后的最新的且是同样的值
深拷贝实现原理
拷贝的对象不会相互收到影响,深拷贝就是把某一个对象的地址和值都拷贝一份,分别在栈中和堆中重新开辟一块属于自己的内存,无论是哪一个值得改变都不会影响另一个的对象的值