QA测试开发工程师面试题满分问答3: python的深拷贝和浅拷贝问题
在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是用于创建对象副本的两种不同方式。
- 浅拷贝是创建一个新的对象,该对象与原始对象的内容相同(包括内部嵌套对象的引用),但是它们指向相同的内存地址。换句话说,浅拷贝创建了一个对象的表面副本,而不是递归复制所有嵌套对象。当原始对象包含可变对象(如列表、字典)时,对副本进行修改可能会影响原始对象。
- 深拷贝是创建一个全新的对象,该对象与原始对象内容相同,包括所有嵌套对象。深拷贝递归地复制所有嵌套对象,而不仅仅是创建一个表面副本。因此,对深拷贝对象的修改不会影响原始对象。
下面是深拷贝和浅拷贝的用途:
- 浅拷贝适用于需要创建一个对象的快速副本,但不需要对副本进行深层次的修改。它可以节省内存和复制时间,特别是当对象包含大量数据或嵌套对象时。
-
深拷贝适用于需要创建一个完全独立的对象,以便对副本进行修改而不会影响原始对象。它用于确保对象及其所有嵌套对象在修改时的独立性。
在 Python 中,可以使用 copy
模块来执行深拷贝和浅拷贝操作。以下是示例代码:
import copy# 浅拷贝示例
original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)# 修改浅拷贝对象的嵌套列表
shallow_copy[2][0] = 5print(original_list) # 输出: [1, 2, [5, 4]]
print(shallow_copy) # 输出: [1, 2, [5, 4]]# 深拷贝示例
deep_copy = copy.deepcopy(original_list)# 修改深拷贝对象的嵌套列表
deep_copy[2][1] = 6print(original_list) # 输出: [1, 2, [5, 4]]
print(deep_copy) # 输出: [1, 2, [5, 6]]
在上述示例中,我们首先对一个包含嵌套列表的原始列表进行浅拷贝和深拷贝操作。然后,修改拷贝后的对象的嵌套列表的值。可以看到,浅拷贝对象的嵌套列表修改也影响了原始列表,而深拷贝对象的修改不会影响原始列表。
可能遇到的问题
在进行深拷贝和浅拷贝时,可能会遇到以下问题:
-
嵌套对象的共享引用:浅拷贝只复制了对象的引用,而不是创建嵌套对象的副本。这意味着如果对浅拷贝对象中的嵌套对象进行修改,原始对象也会受到影响。这可能导致意外的副作用。
-
无限递归:如果存在循环引用或互相引用的对象,进行深拷贝时可能会导致无限递归。这会导致程序进入无限循环并最终引发 "RecursionError" 异常。
-
可变对象的修改:无论是深拷贝还是浅拷贝,如果复制的对象包含可变对象(如列表或字典),对副本进行修改可能会影响原始对象。这是因为副本和原始对象引用同一个可变对象。
-
性能和内存消耗:深拷贝涉及递归地复制所有嵌套对象,这可能对性能和内存消耗产生一定影响,特别是在处理大型对象或嵌套层次较深的对象时。
一个重要问题:嵌套列表内的引用是相同的
当进行浅拷贝时,新创建的列表中的元素是原始列表中元素的引用,而不是元素的副本。这意味着如果在浅拷贝列表中的嵌套列表上进行修改,原始列表中相应的嵌套列表也会受到影响。
通过一个示例来说明这个问题:
import copyoriginal_list = [1, [2, 3], 4]
shallow_copy = copy.copy(original_list)# 修改浅拷贝列表中的嵌套列表
shallow_copy[1].append(5)print(original_list) # 输出: [1, [2, 3, 5], 4]
print(shallow_copy) # 输出: [1, [2, 3, 5], 4]
在上述示例中,我们对一个包含嵌套列表的原始列表进行浅拷贝。然后,我们修改浅拷贝列表中的嵌套列表,结果原始列表中的嵌套列表也被修改了。
这是因为浅拷贝只复制了嵌套列表的引用,而不是创建嵌套列表的副本。因此,对浅拷贝列表中的嵌套列表进行修改实际上是对原始列表中相应的嵌套列表进行修改。
要解决这个问题,你可以使用深拷贝来创建所有嵌套列表的副本,而不是共享引用。这样,对深拷贝列表中的嵌套列表进行修改不会影响原始列表。
import copyoriginal_list = [1, [2, 3], 4]
deep_copy = copy.deepcopy(original_list)# 修改深拷贝列表中的嵌套列表
deep_copy[1].append(5)print(original_list) # 输出: [1, [2, 3], 4]
print(deep_copy) # 输出: [1, [2, 3, 5], 4]
在上述示例中,我们使用深拷贝创建了嵌套列表的副本。对深拷贝列表中的嵌套列表进行修改不会影响原始列表。
因此,当涉及到嵌套列表时,特别是在进行拷贝操作时,请考虑使用深拷贝来确保所有嵌套列表的副本都被创建,以避免意外行为
当涉及到嵌套字典时,浅拷贝也会导致类似的问题。通过一个例子来说明:
import copyoriginal_dict = {'a': 1, 'b': {'x': 2, 'y': 3}}
shallow_copy = copy.copy(original_dict)# 修改浅拷贝字典中的嵌套字典
shallow_copy['b']['x'] = 4print(original_dict) # 输出: {'a': 1, 'b': {'x': 4, 'y': 3}}
print(shallow_copy) # 输出: {'a': 1, 'b': {'x': 4, 'y': 3}}
在上述示例中,我们对一个包含嵌套字典的原始字典进行浅拷贝。然后,我们修改浅拷贝字典中的嵌套字典的值,结果原始字典中相应的嵌套字典也被修改了。
这是因为浅拷贝只复制了嵌套字典的引用,而不是创建嵌套字典的副本。因此,对浅拷贝字典中的嵌套字典进行修改实际上是对原始字典中相应的嵌套字典进行修改。
同样地,为了解决这个问题,你可以使用深拷贝来创建所有嵌套字典的副本,而不是共享引用。这样,对深拷贝字典中的嵌套字典进行修改不会影响原始字典。
import copyoriginal_dict = {'a': 1, 'b': {'x': 2, 'y': 3}}
deep_copy = copy.deepcopy(original_dict)# 修改深拷贝字典中的嵌套字典
deep_copy['b']['x'] = 4print(original_dict) # 输出: {'a': 1, 'b': {'x': 2, 'y': 3}}
print(deep_copy) # 输出: {'a': 1, 'b': {'x': 4, 'y': 3}}
在上述示例中,我们使用深拷贝创建了嵌套字典的副本。对深拷贝字典中的嵌套字典进行修改不会影响原始字典。
因此,无论是嵌套列表还是嵌套字典,在进行拷贝操作时,请考虑使用深拷贝来确保所有嵌套对象的副本都被创建,以避免意外修改原始对象的问题
三段头部互联网大厂测开经历,辅导过25+同学入职大厂,【简历优化】、【就业指导】、【模拟/辅导面试】一对一指导
相关文章:

QA测试开发工程师面试题满分问答3: python的深拷贝和浅拷贝问题
在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是用于创建对象副本的两种不同方式。 浅拷贝是创建一个新的对象,该对象与原始对象的内容相同(包括内部嵌套对象的引用)&…...

Spire.PDF for .NET【文档操作】演示:合并 PDF 文件并添加页码
搜索了这么多有关 PDF 合并的信息后,很容易发现,无论您在线合并 PDF 文件还是使用 C#/VB.NET 来实现此任务,您都无法逃避对 PDF 文件安全等一些重要问题的担忧,因此需要花费多少时间或者合并后的文件是否支持打印页码等等。不过&a…...
VMware使用PowerCLI 修改分布式虚拟交换机的默认上联接口为LAG
简介 创建VMware 分布式交换机vDS 并配置 LACP接口时,然后创建新的默认分布式端口组不会默认使用LACP的上联接口。这意味着当创建新的端口组时,不可避免地会导致没手动修改上联端口的问题,导致网络不通,因为它们无可用的上联端口…...

什么是EDM邮件推广营销?
电子邮件作为最古老的互联网沟通工具之一,凭借其无可比拟的直达性、个性化潜力与高投资回报率,始终占据着企业营销策略的核心地位。随着人工智能技术的革新应用,云衔科技以其前瞻视野与深厚技术底蕴,倾力打造了一站式智能EDM邮件营…...

NoSQL之 Redis配置
目录 关系数据库与非关系型数据库 关系型数据库: ●非关系型数据库 关系型数据库和非关系型数据库区别: (1)数据存储方式不同 (2)扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…...
Android U user+root实现方案
背景 由于项目(MTK平台)上要实现userroot的版本,供特殊用户使用。Android T上的方案无效,经历了各种搜索查看资料,和bsp大佬一起通宵奋战,整出了方案。梳理记录下,有需要的同学可以参考。 Root…...

CSS3 Transform变形理解与应用
Transform:对元素进行变形; Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画。但只有两个关键贞。开始,结束。 Animation:对元素某个属…...

语音克隆技术浪潮:探索OpenAI Voice Engine的奇妙之旅
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
将Python程序打包为Windows安装包
本文使用创作助手。 如果你想将Python程序打包为Windows安装包,你可以使用NSIS(Nullsoft Scriptable Install System)工具。NSIS是一个免费的Windows安装包创建工具。 以下是使用NSIS将Python程序打包为Windows安装包的步骤: 首…...
一个基于大数据的派单管理系统
通常需要处理大量的订单数据,并确保这些数据能够在各个相关部门之间高效、准确地传递。这样的系统不仅有助于提高派单效率,还能优化资源配置,减少不必要的浪费。以下是一个包含所需元素的系统设计方案概述: 数据结构 订单号&…...

【单片机 5.3开关检测】
文章目录 前言一、5.3开关检测1.1没按键按下的1.2有按键按下的 二、改进1.改进 三、独立键盘3.1为什么要取反3.2 实用的按键 总结 前言 提示:这里可以添加本文要记录的大概内容: 课程需要: 提示:以下是本篇文章正文内容…...

每天五分钟计算机视觉:如何基于滑动窗口技术完成目标的检测?
汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…...
wpf ContextMenu
ContextMenu上下文菜单 ContextMenu 在 WPF 中是一个非常有用的控件,它提供了一个在用户执行特定操作(如右键点击)时显示的菜单。ContextMenu 可以附加到几乎所有的 WPF 控件上,使得当用户与这些控件互动时,能够提供一…...

增加网站搜索引擎排名的6个准则
怎样提高网站排名首页 在竞争激烈的网络世界中,网站的排名对于吸引流量和提升曝光至关重要。登上搜索引擎结果页面的首页,意味着更多的曝光和点击率。以下是一些方法,可以帮助您提高网站在搜索引擎中的排名,让其跻身首页…...
【数据库索引】【面试题】【SQL】什么时候不需要用索引?
在数据库查询优化中,索引是一种重要的工具,可以提高查询性能。然而,并不是所有的情况下都适合使用索引。 以下是一些情况下(收集整理)不建议使用索引: 更新频繁的列:索引会占用数据库资源,当列经常被更新时,索引可能会变得过时,导致查询性能下降。 小数值类型:对于…...

RISC-V/ARM mcu OpenOCD 调试架构解析
Risc-v/ARM mcu OpenOCD 调试架构解析 最近有使用到risc-v的单片机,所以了解了下risc-v单片机的编译与调试环境的搭建,面试时问到risc-v的调试可参看以下内容。 risc-v根据官方的推荐,调试器服务是选择OpenOCD,DopenOCD(开放片上…...

HackTheBox-Mist
整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口,将mist.htb加入到hosts文件后,访问mist.htb Pluck CMS文件读取 在…...

游戏引擎中的声音系统
一、声音基础 1.1 音量 声音振幅的大小 压强p:由声音引起的与环境大气压的局部偏差 1.2 音调 1.3 音色 1.4 降噪 1.5 人的听觉范围 1.6 电子音乐 将自然界中连续的音乐转换成离散的信号记录到内存中 采样 - 量化 - 编码 香农定理:采样频率是信…...
【WPF应用29】WPF中的ComboBox控件详解与应用示例
在Windows Presentation Foundation(WPF)应用程序开发中,ComboBox控件是一个非常重要的基础控件,它提供了一个下拉列表,允许用户从预定义的选项中选择一个值。ComboBox控件结合了文本框和列表框的功能,既能…...

Unity UGUI之Text组件基础认识
Text组件用于在游戏中显示文本。 下面来细看下它的基本信息。 一、基本属性: 如上图所示,即为Text组件的一些基本属性,其中, Text:要显示的文本内容。Font:文本所使用的字体。Font Style(字体…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...