深拷贝和浅拷贝 python,python浅拷贝和深拷贝详解

  深拷贝和浅拷贝 python,python浅拷贝和深拷贝详解

  往期面试题:

  枚举Python中的标准异常类?

  说说Python面向对象的三大特点?

  说说Python中的几种数据类型。

  Python模块的三个主要类别是什么?

  事不宜迟,我们开始今天的话题:

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

  答:如果需要在Python中复制对象,需要使用标准库中的复制模块。说到复制模块,我们要说的是深度复制和浅层复制。

  注意深抄和轻抄:可变元素的拷贝

  在light copy中,被复制的新对象的地址与原对象不同,但新对象中的变量元素(如list)的地址与原对象中的相同。也就是说,浅拷贝拷贝了一个浅数据结构(不可变元素),对象中的变量元素作为深数据结构,并没有拷贝到新的地址,而是指向与原对象中的变量元素相同的地址,所以当新对象或原对象中的变量元素被修改时,两个对象同时被改变。但深度复制就不是这样了。这是浅拷贝和深拷贝最根本的区别。(PS:如果不能理解这句话,请先看下面的代码演示,再回头看,会更容易理解。)

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

  代码示例来自:

  https://www.cnblogs.com/feiqiangsheng/p/11026911.html

  1、浅拷贝

  使用复制模块中的复制方法。

  将原始对象中的元素值从010更改为59000也会影响复制的对象;

  将原始对象中的元素值从010更改为59000不会影响复制的对象。

  Copy #定义了一个列表,其中第一个元素是可变类型。list1=[[1,2],费,66];# Make shallow copy list 2=copy . copy(list 1);#对象地址是否相同。打印(id(list 1));打印(id(list 2));#结果:不同4617781646177936#第一个元素地址是否相同。print(id(list 1[0]);print(id(list 2[0]);#结果:相同4624043246240432#第二个元素的地址是否相同。print(id(list 1[1]);print(id(list 2[1]);# Result: same 4554732845547328#更改第一个值以查看复制对象的更改。list 1[0][0]=2;打印(列表2);#结果:复制的对象改变[[2,2],费,66]#改变第二个值看复制的对象改变。list 1[1]= ge ;打印(列表2);#结果:复制的对象没有改变[[2,2], fei ,66]可变类型

  复制模块中deepcopy方法的实现。

  深度复制除了顶层复制之外,还会复制子元素。

  原始对象和复制对象的所有变量元素地址都是不同的。

  Copy #定义了一个列表,其中第一个元素是可变类型。list1=[[1,2],费,66];# Make deep copy list 2=copy . deep copy(list 1);#对象地址是否相同。打印(id(list 1));打印(id(list 2));#结果:不同4617781646177936#第一个元素地址是否相同。print(id(list 1[0]);print(id(list 2[0]);#结果:不同4912385649588784#第二个元素地址是否相同。print(id(list 1[1]);print(id(list 2[1]);# Result: same 4554732845547328#更改第一个值以查看复制对象的更改。list 1[0][0]=2;打印(列表2);#结果:复制的对象没变[[1,2],费,66]#改变第二个值看复制的对象变了。list 1[1]= ge ;打印(列表2);#结果:复制的对象没有改变[[1,2], fei ,66]不可变类型

  1.亮副本和暗副本是源对象的副本,占用不同的内存空间。

  2.不可变类型的对象对明拷贝和暗拷贝没有影响,最终地址值和value都是相等的。

  3、可变对象:值相等但地址不相等。

  如果不同意参考答案,可以指出来,在评论区补充。请留言!

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

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