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

先来道题热热身

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语句都会执行。

欢迎大家去 我的博客 瞅瞅,里面有更多关于测试实战的内容哦!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux虚拟机tomcat上部署web项目的常用命令

1)查看 tomcat是否在运行 ps -ef | grep tomcat ps -ef 补充:Linux中的ps命令是Process Status的缩写,ps命令用来列出系统中当前运行的那些进程。ps命令可以列出当前进程的运行情况(状态、时间等信息)。在Linux系统中…

一文理清Cookie、Session、Token

发展史 1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记…

python中debug有什么用途_史上最方便的Python Debug工具

最近在github上冒出了一个python的debug神器PySnooper,号称在debug时可以消灭print。那么该工具有哪些优点呢,如何使用该工具呢。本文就介绍该工具的优缺点和使用方式。 前言 使用python开发过程中,总是避免不了debug。传统的debug过程大致分…

能力陷阱总结

【readme】 本文总结于《能力陷阱》,感觉非常不错,有兴趣的朋友可以看下; 【1】领导者的能力陷阱 1)改变思想从行动开始; 改变做事方式,然后才能改变自己的思考方式; 2)要先在行…

Java HashMap 遍历方式性能探讨

转载自 Java HashMap 遍历方式性能探讨关于HashMap的实现这里就不展开了,具体可以参考JDK7与JDK8中HashMap的实现JDK8之前,可以使用keySet或者entrySet来遍历HashMap,JDK8中引入了map.foreach来进行遍历。原因:keySet其实是遍历了…

Raft共识算法

前提条件 Raft不考虑拜庭将军问题,即消息会延迟、丢失但不会错误。 Raft的特性 Strong leader:在 Raft 中,日志条目(log entries)只从 leader 流向其他服务器。 这简化了复制日志的管理,使得 raft 更容易…

直方图 帕累托图_如何发现现象背后的关键因素?帕累托图,质量管理的利器...

大家好:无论在日常生活还是工作中,都会发生一些事情或者结果,是我们不希望发生的。我们也希望从根本上解决掉,但有时候却无从下手,比如本来打算用来看书的时间不知道去哪里了;本来打算存款的钱也不知道去哪…

centos8上安装nginx

参考自 https://www.jianshu.com/p/9b2dd37a5af9 ; 【1】安装步骤 step1)安装nginx sudo yum install -y nginx step2)启动nginx服务 -- 开机自启动 sudo systemctl enable nginx -- 开启nginx 服务 sudo systemctl start nginx step3&am…

简单分析KafKa工作原理

架构图 Producer:Producer即生产者,消息的产生者,是消息的入口。 kafka cluster: Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每…

Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

转载自 Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHashMap&#…

kali mysql停止服务器_MySQL 的主从复制(高级篇)

首先要明白为什么要用 mysql 的主从复制:1–在从服务器可以执行查询工作 (即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)2–在从主服务器进行备份,避免备份期间影响主…

centos8安装并启动tomcat9

【1】 步骤如下 step1) 下载tomcat9 step2)centos8 输入 rz命令,把tomcat9 压缩包上传到centos8 没有rz命令, 安装使用 yum -y install lrzsz step3)压缩包解压到tomcat9 step4)配置jdk环境 vim /et…

unity 3d shaderlab 开发实战详解_vue实战开发011:使用router-view嵌套路由详解

前面已经把首页的顶部header和底部的footer页面写完,现在开始写内容区域了,在写内容之前我们先要将路由配置好,不然无法在页面上查看效果,所以这里我在components目录下先建了一个home.vue文件,里面简单的写了一句“我…

go 语言 error 处理的最佳实践

今天分享 go 语言 error 处理的最佳实践,了解当前 error 的缺点、妥协以及使用时注意事项。文章内容较长,干货也多,建议收藏 什么是 error 大家都知道 error[1] 是源代码内嵌的接口类型。根据导出原则,只有大写的才能被其它源码…

请求nginx静态资源报403

【README】 请求nginx静态资源报403; 【1】原因 静态资源防止在某个家目录下,如 /root 目录下 【2】 解决方法1 nginx.conf 文件没有指定用户 # user nobody 修改为 user root; # 设置为root用户 ; 【例子】 user root; #使用r…

DDD中聚合的概念

DDD中的聚合模式是最难弄清楚的一种模式,在如何确定聚合边界这个问题上,更没有一个明确的指导原则,这导致DDD的落地比较难。不过,相信你读了这篇文章应该对聚合会有更深刻的理解。 本文分三部分来讲: 1、什么是聚合&a…

docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器

不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案。不同于传统的单体应用,微服务由于服务数量众多&am…

MySQL日志:binlog、事务日志(redo、undo)

事务的隔离性是通过锁实现,而事务的原子性、一致性和持久性则是通过日志实现。Mysql的日志可以分为: binlog:server层实现事务日志:包括redo log、undo log,引擎层(innodb)实现 redo log red…

vmware安装centos8步骤

【readme】 vmware 安装centos8; 【1】新建虚拟机 step1) 下载 centos8 http://download.nus.edu.sg/mirror/centos/8-stream/isos/x86_64/ 补充,通过代理服务器下载会快很多; step2)vmare,点击文件&…

并发编程 – Concurrent 用户指南

转载自 并发编程 – Concurrent 用户指南1. java.util.concurrent – Java 并发工具包Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前,你需要自己去…