【Python基础知识点】Python的浅拷贝和深拷贝

news/2024/7/27 8:59:39/文章来源:https://blog.csdn.net/crazyjinks/article/details/137255901

概述

本文主要通过两个简单的代码小例子理解深拷贝和浅拷贝

主体内容

copy 模块提供了浅拷贝和深拷贝的功能。它的主要函数有:
copy(x): 返回对象 x 的浅拷贝。
deepcopy(x): 返回对象 x 的深拷贝。
浅拷贝使用 copy(x) 函数,它只复制了最外层的对象,但内层的对象仍然是引用。此外当我们使用切片操作 [:]、工厂函数如 list() copy模块时,也是使用的浅拷贝,尽管我们创建了一个新的对象,它有自己的内存空间。但是,如果原始对象包含其他对象的引用(如列表中的列表,字典中的列表等),那么新对象和原始对象将共享这些内层对象的同一引用。

让我们通过一个例子来理解这一点:

original_list = [1, 2, [3, 4]]
new_list = original_list[:]  # 使用切片操作进行浅拷贝print(original_list)  # 输出: [1, 2, [3, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]# 修改原始列表的第一个元素
original_list[0] = 100
print(original_list)  # 输出: [100, 2, [3, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]# 修改原始列表中内层列表的第一个元素
original_list[2][0] = 300
print(original_list)  # 输出: [100, 2, [300, 4]]
print(new_list)       # 输出: [1, 2, [300, 4]]

在这个例子中:

我们首先创建了一个列表 original_list,其中包含两个整数和一个内层列表。

我们使用切片操作 [:] 创建了 original_list 的浅拷贝 new_list

然后我们修改original_list 的第一个元素。我们发现 new_list 没有受到影响,因为它是一个独立的对象。

但是,当我们修改 original_list 中内层列表的第一个元素时,我们发现 new_list 中的内层列表也被修改了。这是因为 new_listoriginal_list 共享了内层列表的同一引用。

所以,浅拷贝创建了一个新的对象,但如果原始对象包含其他对象的引用,那么新对象和原始对象将共享这些引用。对原始对象的外层修改不会影响新对象,但对内层对象的修改会影响新对象,因为它们共享同一引用。

如果你想创建一个完全独立的副本,包括内层对象,你需要使用深拷贝(deep copy)。在 Python 中,你可以使用copy模块的deepcopy()函数来创建深拷贝。

深拷贝使用 deepcopy(x) 函数,它创建一个新的复合对象,然后递归地插入原始对象中的对象的副本。这意味着深拷贝也复制了内层对象,深拷贝才是真正意义上我们理解的复制,全须全尾地开辟了一个内存空间复制了一遍。

import copyoriginal_list = [1, 2, [3, 4]]
new_list = copy.deepcopy(original_list)  # 使用 deepcopy() 函数进行深拷贝print(original_list)  # 输出: [1, 2, [3, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]# 修改原始列表的第一个元素
original_list[0] = 100
print(original_list)  # 输出: [100, 2, [3, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]# 修改原始列表中内层列表的第一个元素
original_list[2][0] = 300
print(original_list)  # 输出: [100, 2, [300, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]

一句话总结

在大多数情况下,如果你的对象只包含原始数据类型只有一层嵌套,你可以使用浅拷贝。但如果你的对象包含多层嵌套或可变对象,为了确保完全的独立性,你应该使用深拷贝

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

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

相关文章

聊聊CSS

css 的介绍 学习目标 能够知道css的作用 1. css 的定义 css(Cascading Style Sheet)层叠样式表,它是用来美化页面的一种语言。 没有使用css的效果图 使用css的效果图 2. css 的作用 美化界面, 比如: 设置标签文字大小、颜色、字体加粗等样式。 控制页面布局, 比如…

泰迪智能科技携手韶关学院共建实训基地

3月28日,韶关学院数学与统计学院院长宋杰、数学与统计学院副院长李少勇、数学与统计学院骨干教师邓四清、邝神芬、付林林莅临广东泰迪智能科技股份有限公司产教融合实训基地开展“韶关学院实习基地”揭牌仪式。泰迪智能科技高校事业部负责人施兴、培训业务部孙学镂、…

FastAPI Web框架教程 第3章 请求头和请求体

3.1 使用Header接收请求头参数 需求场景 假设现在我们有个图书网站,需要客户端在请求头上携带有效的token,才可以获取图书数据,那FastAPI该如何获取客户端传过来的请求头参数呢? FastAPI的解决方式 示例1:FastAPI获…

大话设计模式之观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,其所有依赖者(观察者)都会收到通知并自动更新。 在观察者模式中,…

Spark-Scala语言实战(8)

在之前的文章中,我们学习了如何在spark中使用RDD方法的map,sortby,collect。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战&…

Word的”交叉引用“和”插入题注“快捷键设置

Word的”交叉引用“和”插入题注“快捷键设置 在MSWord2021中,可以自定义设置快捷键。方法如下:文件-选项-自定义功能区-键盘快捷方式(自定义)。具体过程如图所示。 最后,按照上述流程将插入题注(Insert…

成都直播基地出租:天府新区兴隆湖天府锋巢直播产业基地

天府新区兴隆湖天府锋巢直播产业基地,作为成都乃至西部地区的一颗璀璨明珠,正以其独特的魅力和无限的潜力,吸引着越来越多的目光。这里不仅是成都直播产业的聚集地,更是传统企业转型升级的摇篮,是新媒体时代下的创新高…

【linux】线程的理论介绍

文章目录 一、线程概念1.1 Linux下的线程1.2 线程的优缺点 二、Linux下使用线程2.1 线程接口2.2 线程的TCB2.2.1 线程栈。2.2.2 线程的局部存储 三、线程互斥3.1 互斥的相关概念3.2 非互斥的问题3.3 互斥量(互斥锁)3.3.1 互斥量的接口3.3.2 加锁的注意事…

【面试经典150 | 动态规划】最小路径和

文章目录 写在前面Tag题目来源解题思路方法一:动态规划方法二:空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题…

五、postman基础使用案例

postman基础使用 相关案例【传递查询参数】【提交表单数据】【提交JSON数据】 注:postman⼀款⽀持调试和测试的⼯具,开发、测试⼯程师都可以使⽤。方法一般统一为:方法→请求头→请求体→断言 相关案例 【传递查询参数】 访问TPshop搜索商品的…

MySQL开窗函数

测试环境:mysql8.0.18 官方文档:https://dev.mysql.com/doc/refman/8.0/en/window-functions.html 一、窗口函数介绍二、语法结构三、自定义窗口1.rows(重点)2.range3.默认窗口 四、常用窗口函数示例1.row_number & rank &…

【Leetcode】top 100 二分查找

35 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 基础写法!!!牢记…

Flink CDC 同步数据到Doris

Flink CDC 同步数据到Doris Flink CDC 是基于数据库日志 CDC(Change Data Capture)技术的实时数据集成框架,支持了全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合 Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量…

【现代企业管理】企业组织结构和组织文化的理论与实践——以华为为例

一、前言 管理是科学和艺术的统一体,它是企业成长的保证。企业管理中,管理者面对的往往不是一个完整的系统,而是各种不具有整体规律性的零碎信息的总和,因此进行信息的整合和研究是管理的重点和关键。 组织管理作为管理的四大职…

OWASP API 安全风险,有哪些安全措施

随着互联网的快速发展,Web应用已成为人们日常生活和工作中不可或缺的一部分。然而,Web应用的安全问题也日益凸显,给企业和个人带来了极大的风险。 对于一些安全行业的用户来说,不少都听过关于OWASP这个词,很多用户想要…

设计模式12--组合模式

定义 案例一 案例二 优缺点

【Redis】Redis 生产问题。如何确保缓存和数据库数据的一致性? 常见的缓存更新策略?

目录 缓存穿透 缓存穿透解决办法 缓存击穿 击穿解决办法? 缓存穿透和缓存击穿的区别? 缓存雪崩 雪崩解决办法? 如何确保缓存和数据库数据的一致性? 常见的缓存更新策略? 缓存穿透 定义:缓存穿透说…

Linux学习笔记————C 语言版 LED 灯实验

这里写目录标题 一、实验程序编写二、 汇编部分实验程序编写三、C 语言部分实验程序编写四、编译下载验证 汇编 LED 灯实验中,我们讲解了如何使用汇编来编写 LED 灯驱动,实际工作中是很少用到汇编去写嵌入式驱动的,毕竟汇编太难,而…

linux设置Nacos自启动

前提:已经安装好nacos应用 可参考:Nacos单机版安装-CSDN博客 1. 创建nacos.service 1.1 在 /lib/systemd/system 目录底下,新建nacos.service文件 [Unit] Descriptionnacos Afternetwork.target[Service]Typeforking# 单机启动方式&#…

OmniGraffle Pro for mac 出色的图形设计软件

OmniGraffle Pro是一款非常出色的图形设计软件,它主要适用于Mac和iPad平台,可以用来轻松绘制各种精美的图表、示意图和界面设计。 软件下载:OmniGraffle Pro for mac中文注册激活版 以下是OmniGraffle Pro的一些主要特点和功能: 界…