Python学习之-深拷贝和浅拷贝

前言:

Python中的拷贝主要分为浅拷贝(shallow copy)和深拷贝(deep copy),它们在处理复杂对象(例如包含其他对象的对象)时的行为有明显差异。浅拷贝仅复制对象的第一层,而深拷贝则递归地复制对象的所有层级。理解这两种复制方法对于处理复杂的数据结构至关重要。

1 浅拷贝(Shallow Copy)

浅拷贝创建一个新对象,其内容是原对象中元素的引用。如果原对象中的元素是不可变的(比如整数、字符串和元组),那么这种区别几乎察觉不到,因为它们的值不会改变,仿佛是深拷贝。但如果对象包含可变对象(如列表,字典等),浅拷贝会导致原对象和拷贝对象中的可变元素指向同一对象。因此,修改任何一个对象中的可变元素,另一个对象也会受到影响。浅拷贝可以使用copy模块的copy()函数实现,也可以通过其他方式(如:使用切片操作复制列表)。

1.1 示例:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/6 8:25
# @Author  : Summer
# @File    : test.py
# @describe:
"""import copy# 原始列表
original_list = [1, 2, [3, 4]]# 使用copy模块的copy方法进行浅拷贝
shallow_copied_list = copy.copy(original_list)print("Original list ID:", id(original_list))                         # 原列表的内存地址
print("Shallow Copied list ID:", id(shallow_copied_list))             # 浅拷贝列表的内存地址# 打印浅拷贝前后,嵌套列表的内存地址
print("Original list nested list ID:", id(original_list[2]))          # 原列表中嵌套列表的内存地址
print("Shallow Copied list nested list ID:", id(shallow_copied_list[2])) # 浅拷贝列表中嵌套列表的内存地址# 输出
# Original list ID: 2347612655360
# Shallow Copied list ID: 2347612843904
# Original list nested list ID: 2347612840448
# Shallow Copied list nested list ID: 2347612840448

在浅拷贝的情况下,你会发现original_list和shallow_copied_list的内存地址是不同的,证明它们是不同的对象。然而,original_list[2]和shallow_copied_list[2](即嵌套列表的部分)的内存地址是一样的,说明浅拷贝只复制了最外层对象,内层的嵌套列表仍然是同一个对象。

2 深拷贝(Deep Copy)

深拷贝则不同,它创建一个新对象,并递归地复制原对象中的所有元素。如果原对象包含对其他对象的引用,深拷贝不仅会复制引用的对象的结构,也会复制引用的对象本身。这意味着原对象和副本之间不会相互影响。
深拷贝可以通过copy模块的deepcopy()函数实现,对于深拷贝,我们对同样的原始列表进行操作,并观察内存地址的变化。

2.1 示例

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/6 8:25
# @Author  : Summer
# @File    : test.py
# @describe:
"""import copy
# 原始列表
original_list = [1, 2, [3, 4]]# 使用copy模块的deepcopy方法进行深拷贝
deep_copied_list = copy.deepcopy(original_list)print("Original list ID:", id(original_list))                           # 原列表的内存地址
print("Deep Copied list ID:", id(deep_copied_list))                       # 深拷贝列表的内存地址# 打印深拷贝前后,嵌套列表的内存地址
print("Original list nested list ID:", id(original_list[2]))            # 原列表中嵌套列表的内存地址
print("Deep Copied list nested list ID:", id(deep_copied_list[2]))       # 深拷贝列表中嵌套列表的内存地址# 输出 
# Original list ID: 2293115743744
# Deep Copied list ID: 2293115924032
# Original list nested list ID: 2293115920576
# Deep Copied list nested list ID: 2293115920832

在深拷贝的情况下,original_list和deep_copied_list的内存地址不同,表示它们是不同的对象。与浅拷贝不同的是,嵌套列表original_list[2]和deep_copied_list[2]的内存地址也不相同。这表明深拷贝不仅复制了最外层的对象,还复制了里面所有层级的对象,由此可见每一层的元素都是独立的。

3 深、浅拷贝区别

浅拷贝 (Shallow Copy)
浅拷贝仅复制对象的顶层,如果该对象包含对其他对象的引用,这些引用将会被复制,但引用的对象本身不会被复制。
浅拷贝的结果是,原始对象和其副本共享内部嵌套的对象。这意味着如果你在副本中修改了嵌套对象,原始对象中的相应嵌套对象也会受到影响,反之亦然。
浅拷贝可以通过使用copy模块的copy()函数实现,也可以使用某些其他方法如列表的list()构造函数或切片操作[:]。
浅拷贝通常性能较好,因为它不需要复制嵌套的对象。
深拷贝 (Deep Copy)
深拷贝不仅复制对象的顶层,还会递归复制所有嵌套对象。这意味着它会创建所有原始对象中嵌套元素的副本。
深拷贝的结果是,副本与原始对象完全独立,对副本的修改不会影响到原始对象,反之亦然。
深拷贝可以使用copy模块的deepcopy()函数实现。
深拷贝由于需要复制所有嵌套的对象,所以性能开销相比浅拷贝要大。在处理大型复杂对象时,深拷贝可能会消耗大量的时间和内存。

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

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

相关文章

测试框架pytest学习与实践

pytest是一个专业的测试框架,可以帮助我们对python项目进行测试,提高测试的效率。 pytest官网手册:pytest: helps you write better programs — pytest documentation 中文手册:Pytest 教程 入门学习 安装pytest pip instal…

jvm基础三——类加载器

类加载器 在Java中,类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将类文件(.class文件)加载到JVM中,使得程序能够使用这些类。类加载器在Java中具有重要的作用&…

6 种事件驱动的架构模式

事件驱动架构(Event-Driven Architecture)是一种基于事件和事件处理的软件架构,它的核心思想是将系统的行为和逻辑抽象成一系列事件,这些事件在系统中按照一定的规则和顺序产生和传播,并被相应的处理器处理。事件驱动架构具有高度的灵活性、可…

【数据结构】考研真题攻克与重点知识点剖析 - 第 3 篇:栈、队列和数组

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用,相较于BPMNJS相对容易一些,更加灵活一些,但是扩展代码可能写得更多一些。 示例展示 使用方式 这个的使用方式就简单很多了,利用cdn把js下载下来,引入到HTML文…

c语言之向main函数传递参数

在c语言中&#xff0c;main函数也是可以传递传递参数的&#xff0c;业内向main函数传递参数的格式是 main(int argc,char *argv[]) 向main函数传递参数不是通过代码传递的&#xff0c;一般是通过dos命令传递 举个例子 #include<stdio.h> void main(int argc,char *ar…

PyTorch之计算模型推理时间

一、参考资料 如何测试模型的推理速度 Pytorch 测试模型的推理速度 二、计算PyTorch模型推理时间 1. 计算CPU推理时间 import torch import torchvision import time import tqdm from torchsummary import summarydef calcCPUTime():model torchvision.models.resnet18()…

使用pip install替代conda install将packet下载到anaconda虚拟环境

问题描述 使用conda install 下载 stable_baseline3出现问题 一番搜索下是Anaconda.org缺少源 解决方法 首先使用管理员权限打开 anaconda prompt 然后激活目标环境&#xff1a;conda activate env_name 接着使用&#xff1a;conda env list查看目标env的位置 如D:\anacon…

2023.4.7 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、过去方案和Motivation 4、Segment Anything模型 5、创新点 6、实验过程 7、实验结果 1、评价绩效 2、检测评价 3、跟踪评价 8、 结论 总结 引言 本周阅读了一篇关于高效的任意分割模型的文献&#xff0c;用于自…

JVM基础:类的生命周期详解

JDK版本&#xff1a;jdk8 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 一. 生命周期概述二. 加载阶段(Loading)2.1 加载步骤2.2 查看内存中的对象 三. 连接阶段(Linking)3.1 连接之验证3.2 连接之准备3.3 连接阶段之解析 四. 初始化阶段(Initialization)4.1 单个类的…

Arcgis Pro地理配准

目录 一、目的 二、配准 1、找到配准工具 2、添加控制点 3、选择控制点 4、添加更多控制点 5、配准完成、保存 三、附录 1、查看控制点或删除控制点 2、效果不好怎么办 一、目的 下面我们将两张地图进行配准&#xff0c;其中一张有地理位置&#xff0c;而另外一张没…

数据库的透视

在力扣做到这个题的时候&#xff0c;了解到了透视的概念&#xff0c;下面记录一下我对透视的理解&#xff0c;以及透视需要解决的一个很关键的问题。 一、题目描述 这个题要求重新格式化当前的表 表 Department&#xff1a; ------------------------ | Column Name | Typ…

前端面试高频: 理解 React/Vue 中 Key 的作用

一: 引言 在 React 或 Vue 项目中&#xff0c;我们经常在列表组件中使用key属性。key是给每一个vnode的唯一id&#xff0c;它在列表渲染和虚拟 DOM 操作中扮演着重要的角色。 当我们在渲染一个包含多个相同子组件的列表时&#xff0c;如果没有使用 key&#xff0c;React 或 Vue…

666666666666666666

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Linux (Ubuntu)- mysql8 部署

目录 1.基本部署 2.修改密码 3.开启root可远程连接配置 1.基本部署 01》》先查看OS类型&#xff0c;如果是Ubuntu在往下边看 rootspray:/etc/mysql/mysql.conf.d# lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: …

备战蓝桥杯---线段树应用2

来几个不那么模板的题&#xff1a; 对于删除&#xff0c;我们只要给那个元素附上不可能的值即可&#xff0c;关键问题是怎么处理序号变化的问题。 事实上&#xff0c;当我们知道每一个区间有几个元素&#xff0c;我们就可以确定出它的位置&#xff0c;因此我们可以再维护一下前…

Windows Edge 兼容性问题修复

修复Windows Edge兼容性问题的方法 如果你在使用Windows Edge浏览器时遇到了兼容性问题&#xff0c;可以尝试以下几种方法来解决&#xff1a; 方法一&#xff1a;更改注册表 使用WinR组合键打开运行对话框。在运行对话框中输入regedit并按回车键&#xff0c;打开注册表编辑器…

RK3568测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

非关系型数据库------------Redis的安装和部署

目录 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.2.1非关系型数据库产生背景 1.3关系型非关系型区别 1.4客户访问时&#xff0c;关系型数据库与redis的工作过程 二、Redis 2.1redis简介 2.2Redis命中机制和淘汰机制 2.3Redis 具有以下优…

在Ubuntu 14.04上如何备份和恢复Redis数据

简介 Redis 是一个内存中的键值缓存和存储&#xff08;也可以是数据库&#xff09;&#xff0c;同时也可以持久化&#xff08;永久保存&#xff09;到磁盘上。在本文中&#xff0c;您将了解如何在 Ubuntu 14.04 服务器上备份 Redis 数据库。 默认情况下&#xff0c;Redis 数据…