Time will tell.

1、先来道题热热身


a = ('a', 'b','c')
c = copy.copy(a)
d = copy.deepcopy(a)if c == d:print("c和d的值相等")
if id(c) == id(d):print("c和d的地址相等")

想想最后打印的是什么?

.
.

2、什么是深拷贝和浅拷贝

深拷贝,就是在对某个对象进行拷贝的时候,如果这个对象持有其他对象的引用,在拷贝的时候会将要拷贝的对象以及引用的对象,一起拷贝。

而浅拷贝只拷贝当前对象和持有的索引,不拷贝索引指向的对象。举个例子说明一下,比如当前有个列表a = [1,2,3], b = [3,4,a],[3,4,a]对象持有了[1,2,3]对象的引用,在对b进行深拷贝的时候,会将a对象一起拷贝一份,而浅拷贝的时候则不会。


a = [1,2,3]b = [4,5,6,a]

对b进行浅拷贝


c = copy.copy(b)

这个时候对a对象进行修改,会影响c


a.append(8)c
[4, 5, 6, [1, 2, 3, 8]]

对b进行深拷贝之后,再对a进行修改,则不会影响到d


d = copy.deepcopy(b)d
[4, 5, 6, [1, 2, 3, 8]]a.append(66)d[4, 5, 6, [1, 2, 3, 8]

3、当深浅拷贝遇到可变与不可变对象时会发生什么

上面用列表这种可变数据结构举例,再来看一下元组这种不可变结构,在进行深浅拷贝时定的现象。


a = (1,2,3)
b = copy.copy(a)
c = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(c))

输出:
4502776896
4502776896
4502776896

从结果中发现,a、b、c的内存地址大都是一样,所以在对不可变对象进行拷贝的时候,无论是浅拷贝还是深拷贝,都没有重新在内存中开辟新的地址,都只是对原对象增加了一个引用。

那如果不可变对象汇总包含有对可变对象的引用又会是怎么样呢?


a1 = [1,2,3]
a = (1,2,3, a1)
b = copy.copy(a)
c = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(c))

输出:
4502730288
4502730288
4503232240

b是浅拷贝生成的对象和原对象a的内存地址是一样对的,c是深拷贝生成的对象,发现内存地址和原对象a的地址是不一样的。

也就是说如果不可变对象中持有了可变对象的引用,在进行深拷贝的时候会在内存中开辟新的地址存放对象。

回到文章开头提出的问题,是对不可变对象进行拷贝,而且不可变对象中并没有持有可变对象的引用,所以两个print语句都会执行。

絮叨

如果你处于想学Python自动化或正在学习Python自动化中,Python自动化的教程不少了,但不一定是最新的,说不定你学的是别人一年前就学过的内容。干货分享一波!2020最新的Python教程。获取方式,加175317069私信Q群管理即可免费获取。

喜欢的话,欢迎【评论】、【点赞】、【关注】礼貌三连

Time will tell.(时间会证明一切)

面试官:什么是深拷贝和浅拷贝?相关推荐

  1. 面试官:Java深拷贝和浅拷贝区别

    文章目录 一.拷贝的引入 (1).引用拷贝 (2).对象拷贝 二.浅拷贝 (1).定义 (2).浅拷贝实例 三.深拷贝 (1).定义 (2).深拷贝实例 一.拷贝的引入 (1).引用拷贝 创建一个指向 ...

  2. python深浅拷贝 面试_[面试题二]百度资深面试官:python赋值、浅拷贝与深拷贝

    内存管理相关的面试一直是面试中的重点考察内容.赋值.深拷贝与浅拷贝是日常编码工作中,需要时常关注的知识点.不小心可是会写出bug哦- 赋值 先来看一段代码,下面两段代码的输出结果会是什么呢? # ca ...

  3. java面试常见题:深拷贝与浅拷贝

    深拷贝与浅拷贝的区别 浅拷贝只是拷贝了源对象的地址,所以当源对象发生改变时,拷贝的对象的值也会对应发生改变. 深拷贝则是拷贝了源对象的所有值,而不是地址,所以深拷贝对象中的值不会随着源对象中的值的改变 ...

  4. JS的深拷贝和浅拷贝

    今天,CVTE面试官问了深拷贝和浅拷贝的问题 我的回答是:浅拷贝是拷贝了对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化:深拷贝是另外申请了一块内存,内容和原对象一样,更改原对象,拷贝对象不会发 ...

  5. Java 深入理解深拷贝和浅拷贝区别

    title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...

  6. “约见”面试官系列之常见面试题第十八篇之深拷贝和浅拷贝得区别(建议收藏)

     壹 ❀ 引 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力. 此篇文章中也会简 ...

  7. 面试官:谈谈你对深拷贝和浅拷贝的理解

    在面试的时候,如果面试官问对你说:请谈谈你对深拷贝和浅拷贝的理解,你会怎么回答这个问题呢?可能有很多小伙伴都不太理解深拷贝和浅拷贝的含义和区别,那么今天就和各位小伙伴分享一下我对二者的理解

  8. 有了浅拷贝VS深拷贝,面试官问起来都忘不了

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.赋值.浅拷贝.深拷贝是什么? 二.浅拷贝和深拷贝的区别 三.如何实现浅拷贝和深拷贝 1.浅拷贝: 2.深拷贝:两种 ...

  9. 面试官:深拷贝与浅拷贝有啥区别?

    文章目录 1.前言 2.基本类型的拷贝 3.引用类型的拷贝 3.1 关于引用类型的浅拷贝 3.2 关于引用类型的深拷贝 1.前言 首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在 ...

最新文章

  1. tomcat+bean例子
  2. django查询表记录的十三种方法
  3. 成本中心和内部订单浅析
  4. asp建站系统源码_网站建设教程:虚拟主机如何安装PageAdmin建站系统
  5. SAP Spartacus API 的事务处理特性
  6. 【例3-4】求后序遍历
  7. 超棒的视差滚动效果javascript类库 - Jarallax
  8. MathType与Origin是怎么兼容的
  9. 正则表达式处理字符串指定位置插入【高级】
  10. servlet中filter的的异步问题以及JSP与servlet配合时filter的注意
  11. 诺基亚e72显示服务器繁忙,诺基亚e72用着好不好和手机出现的一些小问题总结
  12. 佳博GP2120TU标签打印机 安装和使用教程(PC)
  13. 什么是多道程序设计技术,试述多道程序运行的特征。
  14. 使用 Java 操作 Kubernetes API
  15. 高等数学 - 两平面的夹角
  16. linux ftp 测网速,武汉电信使用FTP测试网速
  17. 搜索引擎代码资源[转]
  18. Ceph常见问题处理(octopus 15.2.13)
  19. EBS 报表开发:标准报表Text输出改为XML输出
  20. 三角测量(Triangulation 三角化)与 SVD 求解

热门文章

  1. 现代化程序开发笔记(11)——异步编程杂谈
  2. Android自定义系列——6.PorterDuffXfermode
  3. IBM成甩手掌柜 倒贴15亿美元出售芯片制造业务
  4. 推荐武侠沧月的七夜雪
  5. 小辣椒p60手机怎么样_小辣椒k30手机参数配置-小辣椒k30手机怎么样
  6. 快速下载百度网盘文件的方法(不用启动网盘客户端)
  7. php的or和,php中OR与
  8. 2021年中国产业用纺织品行业经济运行情况及2022年发展展望[图]
  9. 在职读金融硕士有用吗?社科院与杜兰大学金融管理硕士项目与你一起找寻答案
  10. 第 1 章 认识一下Java