先来道题热热身

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的地址相等")

想想最后打印的是什么?

什么是深拷贝和浅拷贝

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

而浅拷贝只拷贝当前对象和持有的索引,不拷贝索引指向的对象。举个例子说明一下,比如当前有个列表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]

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

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

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测试开发面试之深浅拷贝相关推荐

  1. python测试开发面试题_python测试开发面试之深浅拷贝

    先来道题热热身 a = ('a', 'b','c') c = copy.copy(a) d = copy.deepcopy(a) if c == d: print("c和d的值相等" ...

  2. 测试开发python面试_python测试开发面试之深浅拷贝

    先来道题热热身 a = ('a', 'b','c') c = copy.copy(a) d = copy.deepcopy(a) if c == d: print("c和d的值相等" ...

  3. python测试开发面试之深浅拷贝【拼多多】

    先来道题热热身 a = ('a', 'b','c') c = copy.copy(a) d = copy.deepcopy(a) if c == d: print("c和d的值相等" ...

  4. python开发面试题目_Python测试开发面试笔试题

    Python 测试开发面试笔试题 一,中文单项选择题(30 分,每个 3 分) 1.下列哪个语句在 Python 中是非法的? A.x = y = z = 1 B.x = (y = z + 1) C. ...

  5. python测试之道第5章模拟网络请求

    python发送网络请求是通过模块中的方法来实现的,模块定义好了请求的语法格式,只需要按照相应的语法格式对号入座写代码即可. 一般来说我们测试的都是基于HTTP和HTTPS的网络请求,python有很 ...

  6. 一道大厂测试开发面试真题,你需要几分钟解答?

    又到一年年底!年底其实是跳槽换坑的绝佳时机,毕竟可以「年前面试,年后入职」,而且面试越早,好坑位较多,可选择的余地也较大.对于做好准备的测试同学来说,是绝对要鼓励多发简历,多找找面试机会的.哪怕为接下 ...

  7. 测试开发面试技巧_面试技巧将给您带来信心并帮助您获得开发工作

    测试开发面试技巧 by John Cobb 约翰·科布(John Cobb) 面试技巧将给您带来信心并帮助您获得开发工作 (Interview tips that will give you conf ...

  8. 【骐程】【深信服测试开发面试】首次面试互联网

    [骐程][深信服测试开发面试]首次面试互联网 面试中出现的问题.主要就是 一面: 主要对自己的项目中使用的技术不是很熟悉,尤其是对自己项目中的hashmap等这些东西的基础底层原理没有看,也没有掌握, ...

  9. python移动化测试开发面试

    什么是压力面试: a) 压力面试是指有意制造紧张,以了解求职者如何面对压力 b) 提出生硬的.不礼貌的问题故意使候选人感到不舒服 c) 针对某一事项或问题做连串的发问,直至无法回答 压力面试的目的: ...

  10. 银行 测试|测试开发 面试真题|面经 汇总

    招银测开面经 一面 1.面向对象3大特征 2.java是否能多继承,怎么实现多继承 3.抽象类 4.数据库特性,隔离级别 5.sql语句查找 6.static关键字的使用 7.手撕:寻找字符串出现频率 ...

最新文章

  1. 解决Qt Creator下 undefined reference to ‘qmain(int,char**)‘的问题
  2. xctf php2,XCTF PHP2
  3. 订单生产计划表范本_生产计划管理与物料控制的实施步骤与要领
  4. 史上最全的Nginx配置参数中文说明
  5. [css] css中的border:none和border:0px有什么区别?
  6. linux ded编译,重新编译deb包
  7. Java 实现Excel表数据的读取和写入 以及过程中可能遇到的问题
  8. 收不到oracle邮件,dovecot不能够收邮件
  9. 【FFMPEG系列】之查看FFMPEG版本号
  10. oracle 回收站
  11. axios的this指向_vue使用axios时this指向哪里
  12. Java之打印指定月份日历
  13. c语言随机数猜数游戏
  14. 三菱f800变频器 频率设定_三菱F800变频器调试参数总结
  15. C语言如何判断一个整数是奇数还是偶数
  16. android代码计时,android秒表计时代码
  17. 深度学习之蛋白质二级结构预测
  18. flask web开发 Set it to True to suppress this warning问题
  19. html5禁止显示相册,手机相册图片莫名被屏蔽,显示“涉嫌违规,系统审查中”半年了...
  20. 如何设置VS的唯美背景

热门文章

  1. highslide图片查看特效
  2. Microsoft .NET 框架常见问题
  3. 【算法】排序_堆排序
  4. 利用ajax如何根据权限加载目录,AJAX调用框架,包含权限验证
  5. python搜索关键词自动提交_根据关键词,自动从搜索引擎采集相关网站的真实地址与标题...
  6. shell中返回值是1为真还是假_shell脚本返回值问题的解决
  7. hashmap 遍历_HashMap面试必问的数据结构相关知识总结
  8. android 判断主线程_腾讯Android面试:Handler中有Loop死循环,为什么没有阻塞主线程...
  9. nginx+uwsgi启动Django项目
  10. WPF备忘录(1)有笑脸,有Popup