**拷贝有很多方法
:**
- copy.copy()浅拷贝
- copy.deepcopy()深拷贝
- 可以通过‘=’进行拷贝
但是这三种方法有什么相同之处和不同之处呢?下面就看看这些方法的不同之处吧。
以拷贝列表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公用一个内存地址。