Python面试题:请解释 Python 中的深拷贝和浅拷贝

在 Python 中,拷贝一个对象有两种方式:浅拷贝(shallow copy)和深拷贝(deep copy)。理解它们的区别和应用场景对于编写高效和正确的代码至关重要。

浅拷贝

浅拷贝创建一个新的对象,但并不复制对象中包含的子对象的内容。相反,它只会将原对象中的子对象的引用复制到新的对象中。因此,原对象和浅拷贝对象共享子对象的引用。

示例
import copy

original_list = [1, 2, [3, 4]]
shallow_copied_list = copy.copy(original_list)

print(original_list)           # 输出: [1, 2, [3, 4]]
print(shallow_copied_list)     # 输出: [1, 2, [3, 4]]

shallow_copied_list[2][0] = 'changed'
print(original_list)           # 输出: [1, 2, ['changed', 4]]
print(shallow_copied_list)     # 输出: [1, 2, ['changed', 4]]
解释
  • copy.copy() 创建了一个浅拷贝。
  • 修改浅拷贝对象中的子对象(列表 [3, 4]),会影响原对象中的相应子对象,因为它们共享同一个子对象的引用。

深拷贝

深拷贝创建一个新的对象,并递归地复制所有子对象的内容。因此,深拷贝对象和原对象是完全独立的,相互之间的修改不会影响对方。

示例
import copy

original_list = [1, 2, [3, 4]]
deep_copied_list = copy.deepcopy(original_list)

print(original_list)           # 输出: [1, 2, [3, 4]]
print(deep_copied_list)        # 输出: [1, 2, [3, 4]]

deep_copied_list[2][0] = 'changed'
print(original_list)           # 输出: [1, 2, [3, 4]]
print(deep_copied_list)        # 输出: [1, 2, ['changed', 4]]
解释
  • copy.deepcopy() 创建了一个深拷贝。
  • 修改深拷贝对象中的子对象,不会影响原对象中的相应子对象,因为它们是独立的。

知识点拓展

  1. 拷贝模块

    • copy 模块提供了浅拷贝和深拷贝的功能,分别通过 copy.copy()copy.deepcopy() 实现。
    • copy 模块也提供了 copy()deepcopy() 方法,可以用来拷贝任何可拷贝的对象。
  2. 浅拷贝的应用场景

    • 当你想要拷贝一个对象,但不希望拷贝包含的子对象时,使用浅拷贝。例如,拷贝一个包含大量子对象的复杂数据结构,但只修改顶层结构。
    • 常见的方法有 copy.copy()list() 和切片操作 [:]
      original_list = [1, 2, 3]
      shallow_copied_list = original_list[:]
      
  3. 深拷贝的应用场景

    • 当你需要完全独立的副本,且包含的所有子对象都需要拷贝时,使用深拷贝。例如,处理深层嵌套的结构,避免任何层级的副作用。
    • 通过 copy.deepcopy() 实现。
  4. 对象的 __copy____deepcopy__ 方法

    • 自定义对象可以通过实现 __copy____deepcopy__ 方法来定义它们的拷贝行为。
      class MyClass:
          def __init__(self, value):
              self.value = value
      
          def __copy__(self):
              return MyClass(self.value)
      
          def __deepcopy__(self, memo):
              return MyClass(copy.deepcopy(self.value, memo))
      
  5. 不可变对象

    • 对于不可变对象(如字符串、元组),浅拷贝和深拷贝没有区别,因为它们的内容不能被修改。
      original_tuple = (1, 2, 3)
      shallow_copied_tuple = copy.copy(original_tuple)
      deep_copied_tuple = copy.deepcopy(original_tuple)
      # 这两种拷贝方式对不可变对象效果相同
      
  6. 嵌套数据结构的拷贝

    • 对于嵌套数据结构,浅拷贝只拷贝顶层对象,而深拷贝会递归地拷贝所有层级的对象。
      original_dict = {"a": 1, "b": {"c": 2}}
      shallow_copied_dict = copy.copy(original_dict)
      deep_copied_dict = copy.deepcopy(original_dict)
      
  7. 拷贝的性能考虑

    • 深拷贝需要递归地拷贝所有子对象,因此比浅拷贝耗时更多,消耗更多的内存。
    • 在性能关键的应用中,选择适当的拷贝方式非常重要。

理解浅拷贝和深拷贝的区别及其应用场景,有助于在编写 Python 程序时选择合适的方法来复制对象,从而提高代码的正确性和效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现前端项目自动构建和部署(Gitee Go)

前言 相信所有的前端开发者都希望将自己的代码部署在服务器上让所有人都能访问到,但是却不知道如何进行部署。其实要是实现代码上线非常简单,我们只需要将build之后的代码上传到服务器,然后通过Nginx起一个服务指向我们build后的代码就可以了…

解析MySQL核心技术:视图的实用指南与实践案例

在数据库管理中,MySQL视图(View)是一种强大的功能,利用它可以简化复杂查询、提高数据安全性以及增强代码的可维护性。本篇文章将详细介绍MySQL视图的相关知识,包括视图的创建、修改、删除、使用场景以及常见的最佳实践…

WAIC热点聚焦|具身智能简介:AI新浪潮的领跑者

WAIC热点聚焦|具身智能简介:AI新浪潮的领跑者 引言 随着"具身智能"(Embodied Intelligence)的火热讨论,2024年标志着人机交互新时代的开启。在大模型技术的推动下,机器人响应语音指令成为现实,…

如何自动筛选螺丝不良品?

四角螺丝是一种特殊设计的螺丝,其螺纹头部呈四个平行的角状结构,与传统的六角螺丝相比具有独特的外观和功能。这种设计使得四角螺丝在安装和拆卸时更容易使用,并提供了更好的扭矩传递效率。四角螺丝头部呈现四个平行的角,与常见的…

系统级应用锁的实现方法

前言: 应用锁是一种常见的需求, 下面提供一个个人认为还比较完美的解决方法。本篇从两个方面详述应用锁的实现方法。 一. 流程图 二. 实现细节 一.流程图 二. 实现效果及细节

RocketMQ复杂过滤尝试

需求 消息实体,根据实体中的一个字段,决定推给多个业务系统。 例:一个点位信息Bean,这个点位信息,设备、能源、安全都有用,那么点位信息表中有适用模块标识。 点位新增 需要通知所有勾选业务系统 tag -…

摄像机反求跟踪软件/插件 Mocha Pro 2024 v11.0.2 CE Win

AE/PR/OFX/达芬奇/AVX插件 | 摄像机反求跟踪软件Mocha Pro 2024 v11.0.2 CE Win-PR模板网 Mocha Pro 软件(插件),用于平面运动跟踪、3D跟踪、动态观察、对象移除、图像稳定和PowerMesh有机扭曲跟踪等功能。整合了SynthEyes核心的3D跟踪算法,能够快速自动…

Pluck-CMS-Pluck-4.7.16 远程代码执行漏洞(CVE-2022-26965)

前言 CVE-2022-26965 是一个影响 Pluck CMS 4.7.16 版本的远程代码执行(RCE)漏洞。该漏洞允许经过身份验证的用户通过 /admin.php?actionthemeinstall 的主题上传功能执行任意代码。 漏洞细节 在 Pluck CMS 的管理界面中,管理员可以上传主…

【数据结构】(C语言):堆(二叉树的应用)

堆: 此处堆为二叉树的应用,不是计算机中用于管理动态内存的堆。形状是完全二叉树。堆分两种:最大堆,最小堆。最大堆:每个节点比子树所有节点的数值都大,根节点为最大值。最小堆:每个节点比子树…

千万不要用国产BI,不然你会发现它性价比奇高——以奥威BI软件为例

在信息技术日新月异的今天,企业对于商业智能(BI)软件的选择往往陷入了一个误区:盲目追求国际品牌,却忽视了身边那些性价比极高的国产精品。如果你不慎踏入了“千万不要用国产BI”的陷阱,那么奥威BI软件将是…

PHP家政服务预约单开版微信小程序系统源码

🏠 —— 便捷生活,从指尖开始💪 🌈【开篇:家政新风尚,一键触达】 在忙碌的生活节奏中,你是否渴望拥有一个温馨、整洁的家,却又苦于找不到合适的家政服务?现在&#xff…

C++_03

1、构造函数 1.1 什么是构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 每次构造的是构造成员变量的初始化值,内存空间等。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不…

对标GPT-4o!不锁区、支持手机、免费使用,Moshi来啦!

7月4日凌晨,法国知名开源AI研究实验室Kyutai在官网发布了,具备看、听、说多模态大模型——Moshi。 Moshi功能与OpenAI在5月14日展示的最新模型GPT-4o差不多,可以听取人的语音提问后进行实时推理回答内容。但GPT-4o的语音模式要在秋天才能全面…

适合弱电行业的项目管理软件!找企智汇软件!

随着科技的不断发展,弱电行业对于项目管理的需求日益增强。为满足这一需求,企智汇推出了一款专为弱电行业打造的工程项目管理系统。 企智汇弱电行业工程项目管理系统以其专业性、高效性和智能性,赢得了业界的广泛认可。该系统深入融合了弱电…

仓库管理系统

create database Warehouse_management;//建库 use Warehouse_management; 一、建表 1、管理员信息表 CREATE TABLE ManagerInfo (Mno CHAR(3) PRIMARY KEY,Mname VARCHAR(10) NOT NULL,Mgender CHAR(1) DEFAULT 男,Mbirhdate DATE,Mtelephone CHAR(11) NOT NULL,Mhiredate …

数据预处理:统计关联性分析/数据清洗/数据增强/特征工程实例

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

C++(第四天----拷贝函数、类的组合、类的继承)

一、拷贝构造函数(复制构造函数) 1、概念 拷贝构造函数,它只有一个参数,参数类型是本类的引用。如果类的设计者不写拷贝构造函数,编译器就会自动生成拷贝构造函数。大多数情况下,其作用是实现从源对象到目…

Access,Trunk,Hybrid网络设备链接类型详解

带着问题找答案:网络链路上的数据包怎么看,是否携带vlan-id如何看,以及如何设计链接类型满足用户要求,请看如下解析。 第一种:链接类型access 无标记数据帧 第二种:链接类型trunk 第三种&#xf…

最新mysql打开远程访问和修改最大连接数

这里写目录标题 1.使用navicat进入命令控制板,进入use mysql;2.查询用户表3.更新user表中root用户域属性,%表示允许外部访问4.执行以上语句之后再执行,FLUSH PRIVILEGES;5. 执行授权语句修改最大连接数 1.使用navicat进入命令控制板,进入use mysql; use…

为什么写Python脚本时要加上if __name__ == ‘__main__‘?

目录 一、__name__ 的秘密 二、if __name__ __main__: 的作用 三、代码示例与案例分析 示例一:简单的数学工具模块 示例二:命令行工具 四、实际应用场景 五、进阶应用 1. 插件开发 2. 动态加载模块 3. 交互式与脚本模式切换 六、结论 在Pyth…