往期面试题:

列举Python中的标准异常类?

说说Python面向对象三大特性?

说说Python中有几种数据类型?

说说Python模块主要分哪三类?

废话不多说,开始今天的题目:

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

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

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

在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的。也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的。但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别 。(PS:这句话如果看不懂,请先看下面的代码演示,回过头来再看,就比较好理解了 。)

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

代码例子来源于:

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

1、浅拷贝

使用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、深拷贝

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深浅拷贝总结:

1,深浅拷贝都是对源对象的复制,占用不同的内存空间。

2,不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的。

3,可变类型的对象:值相等,地址不相等 。

如果对于参考答案有不认同的,大家可以在评论区指出和补充,欢迎留言!

Python中深拷贝与浅拷贝的区别?相关推荐

  1. python中深拷贝与浅拷贝的区别

    ####################python中的数据类型####################### ##########python中的数据类型有6种,分别为:数字类型如int,float ...

  2. python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解

    甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋 ...

  3. 浅析Python中深拷贝和浅拷贝

    按照以下不同情况,在IDE中逐个解除注释,就明白了 import copy""" 第一种情况,不可变类型变量,都是引用 """ # a = ...

  4. python中深拷贝和浅拷贝

    转载于:https://www.cnblogs.com/mihoutao/p/10955858.html

  5. Python基础:对象的深拷贝和浅拷贝的区别

    Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...

  6. python 深拷贝_详解python的复制,深拷贝和浅拷贝的区别

    概述 今天主要来看看Python中的浅拷贝和深拷贝内容,这里用一个实例来说明~ 需求: 将一个列表的数据复制到另一个列表中. 思路: 使用列表[:],拿不准可以调用copy模块. 实现方法: #!/u ...

  7. python的复制,深拷贝和浅拷贝的区别

    python的复制,深拷贝和浅拷贝的区别 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有 ...

  8. Python中 list[:]与 list 的区别

    Python中 list[:] 与 list 的区别 最近leetcode刷题的时候,总是碰到最后返回的结果是[[],[],[]-[]]这样的形式,就是说列表中的元素也是列表,我们假设外面的大列表为r ...

  9. 【从零学Python】深拷贝和浅拷贝、二维数组初始化

    Python 的深拷贝和浅拷贝 直接赋值: 其实就是对象的引用(别名). 浅拷贝(copy): 拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcop ...

最新文章

  1. 【Java注解】注解基础
  2. 跨浏览器设置标签样式
  3. python3 报错 ‘builtin_function_or_method‘ object has no attribute 解决方法
  4. limit是mysql的语法
  5. 剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作
  6. android 窗口监听按键,Android编程实现Dialog窗体监听的方法
  7. apache 禁止trace或track防止xss***
  8. 95-10-200-启动-结尾
  9. 看视频学编程之WinForm
  10. centos php5.6 phpize,centos7-install-php5.6.40
  11. 【图神经网络】向往的GAT(图注意力模型)
  12. Idea 我的快捷键总结
  13. 用Java实现向Cassandra数据库中插入和查询数据
  14. 仿uc设置默认浏览器
  15. 第二关练习讲解(下部)
  16. 安装程序无法打开注册表项 UNKNOWN\Components\…的简单解决办法
  17. ipv6的 bind dns 正向解析与反向解析
  18. aardio - 小窍门及注意事项收集贴
  19. 嵌入式系统测试工具——ETest
  20. 专业系统维护:CleanMyMac X for mac

热门文章

  1. redis单主机多实例
  2. 后台(crontab,at,,nohup)
  3. CSS的六种垂直居中
  4. 反思PHP多个字符串函数
  5. x86架构和arm架构_RISC-V架构1000核CPU登场 x86架构腹背受敌
  6. 1px问题在ios与android,IOS安卓常见问题
  7. PHP判断上传文件类型
  8. jquery饼状图插件的指引线_JQuery图表插件Highcharts示例教程
  9. vfp如何比较两张表的关键字重复_Access开发中建表的基本原理和规范(上)
  10. 导出测试点的信号名_小程序导出数据到excel表,借助云开发云函数实现excel数据的保存...