9.python 浅拷贝和深拷贝

最后更新于:2019-11-11 10:03:04

何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,python开发项目的时候说不定你就能碰上这样的坑~~

python

一.普通的变量赋值

我们平常使用的变量赋值就是浅拷贝,即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化,演示代码如下:

输出结果:

注意:常规的变量赋值共享一个内存块,内存地址相同,一旦值发生改变,共享同一个内存地址的所有变量值都会发生改变,可以直接通过内置函数id()对比下内存地址即可!

 

哟呵

 

二.浅拷贝和深拷贝

在python开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下copy模块:

copy.copy() – 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象;

copy.deepcopy() – 深拷贝,重新分配内存,拷贝对象及其所有子对象;

浅拷贝/深拷贝

1.浅拷贝copy()

输出结果:

 

2.深拷贝deepcopy()

输出结果:

 

3.浅拷贝和深拷贝区别

对于常规的字典或者列表使用copy模块的深拷贝或者浅拷贝,两者并没有区别!如果字典或者列表中还有包含有子类的话,使用copy模块的深拷贝和浅拷贝的话,结果就大不相同了:

copy.copy() — 重新分配内存,只拷贝父对象,不会拷贝对象内部的子对象;

copy.deepcopy() — 重新分配内存,拷贝对象及其所有子对象;

示例代码如下:

输出结果:

由此可见:

如果列表或者字典没有包含子列表或者子字典的话,使用深拷贝或者浅拷贝效果都有一样;

如果列表或者字典中存在子类的时候,只有深拷贝才会为所有的子类也重新分配内存,而浅拷贝只负责父对象,不考虑子对象!!

耳朵

 

猜你喜欢:

1.python列表推导式

2.python字典推导式

3.python return逻辑运算

4.python线程创建

5.python匿名函数lambda

 

转载请注明猿说Python » python浅拷贝和深拷贝

 

技术交流、商务合作请直接联系博主
扫码或搜索:猿说python
python教程公众号
猿说python
微信公众号 扫一扫关注