【无标题】

浅拷贝的区别

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B

否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那

就是深拷贝,自食其力。

可变对象,不可变对象

可变对象:一个对象在不改变其所指向的地址前提下,可以修改其所执行的地址中的值

不可变对象:一个对象所指向的地址上的值是不能修改的,如果修改了就是它执行的地址就改变了,相当于将这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了。

区别:可变对象就不会这样会修改值后另存到一个新的地址上,而是直接再原对象的地址上把值给改变了,这个对象依然执行这个地址

本质区别:可变对象修改了值,不会新建一个内存地址的对象,不可变对象如果修改了值,及时复制了一份新的内存地址,原始地址的值不会被改变

  1. 如果是基本数据类型,名字和值都会储存在栈内存中

 

当然,这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据

  1. 如果是引用数据类型,名字存在栈内存中,值存在堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值

 

1.1.2.浅拷贝

浅拷贝:创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。 如果属性是基本类型,拷贝的就是基本类型的值。 如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象

缺点: 浅拷贝只能实现一层的拷贝,无法进行深层次的拷贝

 

图形原理

 


深拷贝

深拷贝:对原对象的地址的拷贝,新拷贝了一份与原对象不同的地址的对象,修改对象中的任何值,都不会改变深拷贝的对象的值。

深拷贝(深度克隆):不仅复制对象的基本类,同时也复制原对象的对象,完全是新对象产生的

copy.deepcopy 深拷贝——拷贝对象的值类型,还拷贝了原始对象,而产生了一个新的对象,不仅仅只拷贝了原始对象的引用 如图:每一层创建的都是新的内存地址

缺点: 无法实现对对象中 方法 的拷贝,会显示为undefined

 

图形原理

 

实现原理

浅拷贝实现原理

在引用数据类型中,一个引用数据把值赋给另一个引用数据类型,仅仅只是在栈中将引用的地址复制一遍,在栈中在开辟一个内存,存放一个相同的地址而已,但是并没有在堆中对应地开辟一块内存用来存放新的值。这就出现了两个地址指向同一块堆中的值,其实就是同一个值,无论是哪一有变动,两个取到的值都只

是改变过后的最新的且是同样的值

深拷贝实现原理

拷贝的对象不会相互收到影响,深拷贝就是把某一个对象的地址和值都拷贝一份,分别在栈中和堆中重新开辟一块属于自己的内存,无论是哪一个值得改变都不会影响另一个的对象的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值