Python 深浅拷贝

巧了我就是萌 提交于 2019-11-28 02:59:41

**拷贝有很多方法

:**

  1. copy.copy()浅拷贝
  2. copy.deepcopy()深拷贝
  3. 可以通过‘=’进行拷贝

但是这三种方法有什么相同之处和不同之处呢?下面就看看这些方法的不同之处吧。

以拷贝列表list为例:
首先引入Python copy包:
在这里插入图片描述

浅拷贝:

在这里插入图片描述

从结果中看出,输出的列表a、b内容一致。
对列表b中的单个元素记性修改

在这里插入图片描述

从结果中看出,列表b修改单一元素,对列表a的元素不影响。

在这里插入图片描述

查看输出结果发现,列表a中嵌套的列表元素也被修改。

这是为啥呢? 引用图解释

在这里插入图片描述

b列表复制a列表内的元素后,会指向a列表元素的内存地址

在这里插入图片描述

当修改b列表中的嵌套列表元素是,b先找到对应列表的内存地址0088,然后再找到对应的列表元素,
使其从新指向修改后的新的元素的内存地址。由于列表a、列表b指向的是同一个嵌套列表的内存地址,
所以当b对嵌套列表进行修改,响应的a的嵌套列表的元素也会发生改变。
可以看出,浅拷贝只是copy最外层的内容,所以浅拷贝不是完全拷贝。

**

深拷贝:

**
在这里插入图片描述

列表a、b的元素相同
对列表b的单一元素进行修改

在这里插入图片描述

列表b对单一元素的修改对列表a的元素不影响
对列表b中的嵌套列表中的元素进行修改

在这里插入图片描述

查看结果,b的修改对原a的元素也不影响.
可以看出,经过深拷贝,拷贝前后的列表对本身元素的修改都不会影响另一个列表的元素。
所以,深拷贝是完全拷贝

**

‘=’:

**
在这里插入图片描述

从图中看出,a赋值给b,b将指向a中各个元素的内存地址,
当其中b进行修改元素之,a中的元素也会修改。
因为a、b公用一个内存地址。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!