python中深拷贝和浅拷贝,python中浅拷贝和深拷贝的区别

  python中深拷贝和浅拷贝,python中浅拷贝和深拷贝的区别

  在开始讨论轻抄和深抄的区别之前,我们首先要知道赋值是什么?

  在Python中,所谓的赋值,其实就是一个对象引用的传递。当一个对象被创建并赋给另一个变量时,它不会被赋给另一个变量。相反,地址空间中这个变量的id地址值被传递给另一个变量。简单来说就是复制这个对象的引用。看图,可能更容易理解。

  从图中,我们很容易的看到,a和b两个变量在地址空间中是一样。后来,我们又给a增加一个值89之后,a和b两个地址值还是一样

  灯光复制灯光复制是对象的父对象(外层)的副本,不复制子对象(内层)。使用轻拷贝时,有两种情况。

  第一,如果最外层的数据类型是可变的,比如列表,字典等。轻拷贝将打开一个新的地址空间来存储。

  第二,如果最外层的数据类型是不可变的,比如元组,字符串等。浅拷贝对象,或者引用对象的地址空间。

  看图,我们可以清楚的看到C的最外层是[a,b],这是一个可变数据类型。D在浅拷贝的时候,也是直接取最外层。只复制最外层,内部不获取。

  从图中可以看出,p(m,n)的最外层是元组不可变类型。Q做浅拷贝时,直接引用P的地址,而不是开辟新的地址空间进行存储。

  深层复制深层复制是一个对象在所有层次上的复制(递归),内部和外部都会被复制。

  深度复制也可以分为两种情况:

  首先,可以更改最外层的数据类型。此时,将制作内部和外部副本。

  其次,外部数据类型是不可变的。如果内部数据类型是可变的,将打开一个新的地址空间进行存储。如果内部数据类型是不可变的,它将是对地址的引用,就像浅层拷贝一样。

  上图是最简单的深度复制。很容易看出两个id值发生了变化,修改了一边,不影响另一边。

  上面有嵌套副本。很明显外层和内层的地址空间都变了。

  从图中可以看出,只要内部数据类型是变量,外部数据类型是变量,深度拷贝就会打开一个新的地址空间进行存储。修改原始变量不会影响深层副本。

  深拷贝的作用:

  减少内存使用后,在对数据进行清理、修改或入库时,对原始数据进行备份,防止数据修改后原始数据被找到。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: