导航
  • 报考
  • 备考
  • 政策

报考

备考

复习资料

政策

行业动态

python深拷贝和浅拷贝的区别是什么?这些用法才是我们要关注的

环球青藤·2020-07-10 14:18:35浏览47 收藏14

请输入下面的图形验证码

提交验证

预约成功

我知道了
摘要 复制的新对象的地址与原始对象不同,但是新对象中的可变元素(如列表)的地址与原始对象中的可变元素的地址相同,那么python深拷贝和浅拷贝的区别是什么?这些用法才是我们要关注的,所以你知道python深拷贝和浅拷贝的区别是什么?这些用法才是我们要关注的。

问:说说Python中深拷贝与浅拷贝的区别?

答:Python中如果需要拷贝对象,需要使用标准库中的copy模块。而说到copy模块,不得不说的就是深拷贝与浅拷贝。

深拷贝和浅拷贝需要注意的地方就是:可变元素的拷贝

在浅复制中,复制的新对象的地址与原始对象不同,但是新对象中的可变元素(如列表)的地址与原始对象中的可变元素的地址相同。浅拷贝它拷贝数据结构元素的浅层次(不可变的),在变量元素作为底层数据结构不是复制到新的地址,但随着变量元素的原始对象指向同一个地址,所以在新对象或原始对象的变量元素变化,两个物体在同一时间都在变化。这是浅拷贝和深拷贝之间的根本区别。(PS:如果你不明白这个句子,请看下面的代码演示。

下面分别来说说这两者的区别:

1、python深拷贝和浅拷贝的区别是什么——浅拷贝

使用copy模块里面的copy方法实现。

改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;

改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

import copy#定义一个列表,其中第一个元素是可变类型。

list1 = [[1,2], 'fei', 66];#进行浅

copylist2 = copy.copy(list1);#对象地址是否相同。

print(id(list1));print(id(list2));#结果:不同4617781646177936#第一个元素地址是否相同。

print(id(list1[0]));print(id(list2[0]));#结果:相同4624043246240432#第二个元素地址是否相同。

print(id(list1[1]));print(id(list2[1]));#结果:相同4554732845547328#改变第一个值,查看复制对象变化。

list1[0][0] = 2;print(list2);#结果:复制对象发生变化[[2, 2], 'fei', 66]#改变第二个值,查看复制对象变化。

list1[1] = 'ge';print(list2);#结果:复制对象没发生变了[[2, 2], 'fei', 66]

2、python深拷贝和浅拷贝的区别是什么——深拷贝

copy模块里面的deepcopy方法实现。

深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。

原始对象和拷贝对象所有的可变元素地址都不一样了。

import copy#定义一个列表,其中第一个元素是可变类型。

list1 = [[1,2], 'fei', 66];#进行深

copylist2 = copy.deepcopy(list1);#对象地址是否相同。

print(id(list1));

print(id(list2));#结果:不同4617781646177936#第一个元素地址是否相同。

print(id(list1[0]));print(id(list2[0]));#结果:不同4912385649588784#第二个元素地址是否相同。

print(id(list1[1]));print(id(list2[1]));#结果:相同4554732845547328#改变第一个值,查看复制对象变化。

list1[0][0] = 2;print(list2);#结果:复制对象没发生变了[[1, 2], 'fei', 66]#改变第二个值,查看复制对象变化。

list1[1] = 'ge';print(list2);#结果:复制对象没发生变了[[1, 2], 'fei', 66]

以上就是《python深拷贝和浅拷贝的区别是什么?这些用法才是我们要关注的》的全部内容,复制的新对象的地址与原始对象不同,但是新对象中的可变元素(如列表)的地址与原始对象中的可变元素的地址相同,如果你想知道更多的python的相关方法,可以点击下方资料下载链接

展开剩余
资料下载
历年真题
精选课程
老师直播

注册电脑版

版权所有©环球青藤All Rights Reserved