Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

本文主要来自:一文了解Python深拷贝与浅拷贝问题

拷贝的产生缘由:

在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生了拷贝。

背景知识:

  • 在 Python 中,变量名就是地址的一种表示形式,并不开辟开辟存储空间。

  • 可变对象:所谓可变是指可变对象的值可变,身份(id)是不变的。如:列表、字典、集合

  • 不可变对象:就是对象的身份和值都不可变。如:数字(数字也是不可变,切记)、字符串、元组。


赋值(=),赋值的本质就是让多个变量同时引用同一个对象的地址,修改其中任意一个变量都会影响到另一个。

  • 对不可变对象赋值,实际就是在内存中开辟一片空间指向新的对象,原不可变对象不会被修改。

     

  • 可变对象保存的并不是真正的对象数据,而是对象的引用。当对可变对象进行赋值时,只是将可变对象中保存的引用指向了新的对象。(地址没变)

 

 

浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。(顶层拷贝值,底层拷贝引用){copy模块的copy.copy()函数}

  • 不可变对象只在修改的时候才会在内存中开辟新的空间, 而拷贝实际上是让多个对象同时指向一个引用,和对象的赋值没区别。
  • 可变对象的拷贝,会在内存中开辟一个新的空间来保存拷贝的数据。当再改变之前的对象时,对拷贝之后的对象没有任何影响。(顶层拷贝值,底层拷贝引用)

 

 

 

再来一个例子:(顶层拷贝值,底层拷贝引用) a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

 

 

深拷贝:完全拷贝了父对象及其子对象。深拷贝就是将顶级对象以及子对象的值同时复制给新对象,此时修改任何一个都不会影响另一个。{copy模块的 copy.deepcopy()函数}

  • 可变对象的深拷贝:

 

 

 

总结:

  • 不可变对象在赋值时会开辟新空间。

  • 可变对象在赋值时,修改一个的值,另一个也会发生改变。

  • 深、浅拷贝对不可变对象拷贝时,不开辟新空间,相当于赋值操作。

  • 浅拷贝在拷贝时,只拷贝第一层中的引用,如果元素是可变对象,并且被修改,那么拷贝的对象也会发生变化。

  • 深拷贝在拷贝时,会逐层进行拷贝,直到所有的引用都是不可变对象为止。

  • 大多数情况下,编写程序时,都是使用浅拷贝,除非有特定的需求。

  • 浅拷贝的优点:拷贝速度快,占用空间少,拷贝效率高


        因为是初学,笔者认为赋值和深拷贝不难理解,主要难点在浅拷贝上,而浅拷贝对于不可变对象相当于赋值操作,难点的难点是可变对象的浅拷贝,记住一句不严谨话:顶层拷贝值,底层拷贝引用。这句话的理解就是:如果a = [1, 2, [3,4,5]] , b = copy.copy(a), 修改a[0] = 6,则b不变,因为b已经拷贝过a的值了,而如果修改a[2].append(6),则b也会跟着变,因为拷贝的是底层的引用。

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值