Python案例--copy复制

news2024/11/28 0:39:24

在Python编程中,数据的复制是一个常见且重要的操作,它涉及到赋值、浅拷贝和深拷贝三种不同的概念。正确理解这三种操作对于编写高效且正确的程序至关重要。本文将通过一个简单的Python示例,探讨这三种数据复制方式的区别及其应用场景,并深入分析其背后的原理。

一、引言

在Python中,对象是通过引用来访问的。当我们将一个对象赋值给另一个变量时,实际上是将对象的引用复制给了新的变量。这意味着原始对象和新变量指向的是同一个内存地址。浅拷贝和深拷贝则是创建了对象的新副本,但它们在处理对象内部结构时有所不同。本文将通过一个具体的代码示例来说明这些概念。

二、问题描述

题目 :将一个列表的数据复制到另一个列表中。

考虑一个包含整数和列表的列表对象,我们对这个对象进行赋值、浅拷贝和深拷贝,并观察对原始对象的修改如何影响这些副本。

三、解决问题

Python代码实现

import copy

# 原始列表
a = [1, 2, 3, 4, ['a', 'b']]

# 赋值(引用复制)
b = a

# 浅拷贝(列表推导式)
c = [elem for elem in a]

# 浅拷贝(list()函数)
d = list(a)

# 深拷贝(copy模块的deepcopy函数)
e = copy.deepcopy(a)

# 修改原始列表
a.append(5)
a[4].append('c')

# 打印结果
print('a=', a)
print('b=', b)
print('c=', c)
print('d=', d)
print('e=', e)

四、代码解释

  1. 赋值(引用复制)b = a 这行代码将a的引用复制给了b。这意味着ba指向同一个列表对象。

  2. 浅拷贝(列表推导式)c = [elem for elem in a] 这行代码创建了一个新的列表c,其中包含了a中每个元素的副本。如果元素是不可变类型(如整数),则c中的元素是新副本;如果是可变类型(如列表),则c中的元素仍然是原始对象的引用。

  3. 浅拷贝(list()函数)d = list(a) 这行代码同样创建了一个新的列表d,其行为与列表推导式相同。

  4. 深拷贝(copy模块的deepcopy函数)e = copy.deepcopy(a) 这行代码创建了a的一个完全独立的副本。这意味着e中的所有元素都是新的对象,与原始对象没有任何引用关系。

  5. 修改原始列表:通过a.append(5)a[4].append('c')修改原始列表a

  6. 打印结果:打印修改后的原始列表a以及各个副本bcde

五、运行结果

运行上述代码,输出结果如下:

六、应用场景

  1. 赋值(引用复制):适用于需要快速访问同一对象的场景,但需要注意修改原始对象会影响所有引用。

  2. 浅拷贝:适用于对象中包含不可变类型元素的场景,或者需要快速复制对象但不需要完全独立的副本。

  3. 深拷贝:适用于需要完全独立的副本,且对象内部包含可变类型元素的场景。

七、深入分析

(一)、引用复制的原理

在Python中,赋值操作实际上是创建了一个指向原始对象的新引用。这意味着任何对原始对象的修改都会反映在所有引用该对象的变量上。这在某些情况下非常有用,比如当你需要多个变量来操作同一个对象时。

(二)、浅拷贝的原理

浅拷贝创建了一个新的容器对象,但容器中的元素仍然是原始对象的引用。这意味着如果原始对象中的元素是可变类型,那么修改这些元素会影响到所有浅拷贝。浅拷贝通常用于创建对象的副本,但不需要复制对象内部的元素。

(三)、深拷贝的原理

深拷贝不仅复制了对象本身,还递归地复制了对象中包含的所有对象。这意味着深拷贝会创建一个完全独立的副本,原始对象和副本之间不会相互影响。深拷贝通常用于需要完全独立的副本,且对象内部包含可变类型元素的场景。

八、性能考虑

在实际应用中,选择合适的复制方式对于程序的性能至关重要。赋值和浅拷贝通常比深拷贝更快,因为它们不需要创建对象的完整副本。然而,如果需要完全独立的副本,深拷贝是唯一的选择。

九、结论

通过上述示例,我们可以看到赋值、浅拷贝和深拷贝在Python中的区别及其适用场景。理解这些概念对于编写正确和高效的Python程序至关重要。通过选择合适的复制方式,我们可以避免意外的副作用,确保程序的正确性和性能。此外,深入理解这些操作的原理和性能影响,可以帮助我们在实际编程中做出更好的决策。


!仅供参考

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

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

相关文章

数据结构 ——— 单链表oj题:环状链表(求出环的入口节点)

目录 题目要求 手搓一个简易带环链表 代码实现 题目要求 给定一个链表的头节点 head,返回链表开始入环的第一个节点,如果链表无环,则返回NULL 手搓一个简易带环链表 代码演示: struct ListNode* n1 (struct ListNode*)mal…

深度学习:循环神经网络—RNN的原理

传统神经网络存在的问题? 无法训练出具有顺序的数据。模型搭建时没有考虑数据上下之间的关系。 RNN神经网络 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络。在处理序列输入时具有记忆性…

Mac上强大的菜单栏管理工具

想要Mac用的好,各种工具少不了,一款好用的软件对于提高使用效率和使用舒适度来说非常必要,iBar-强大的菜单栏图标管理工具 随着 Mac 运行的软件增加,状态栏中的图标也越来越多,不仅看得眼花缭乱,而且刘海屏…

基于SpringBoot+Vue的农场管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

ORM框架简介

什么是ORM? ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在关系数据库和对象程序语言之间转换数据。ORM框架允许开发者以面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。简单…

CMake 属性之目录属性

【写在前面】 CMake 的目录属性是指在特定目录(及其子目录)范围内有效的设置。 这些属性不同于全局变量或目标(Target)属性,它们提供了一种机制,允许开发者为项目中的不同部分定义不同的构建行为。 通过目录…

HarmonyOS NEXT应用开发实战(二、封装比UniApp和小程序更简单好用的网络库)

网络访问接口,使用频次最高。之前习惯了uniapp下的网络接口风格,使用起来贼简单方便。转战到鸿蒙上后,原始网络接口写着真累啊!目标让鸿蒙上网络接口使用,简单程度比肩uniapp,比Axios更轻量级。源码量也不多…

Spring Cloud全解析:链路追踪之springCloudSleuth简介

文章目录 springCloudSleuth简介链路追踪?SpringCloudSleuth术语链路示意图zipkin依赖配置 springCloudSleuth简介 链路追踪? 什么是链路追踪?就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示&#xff…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(多数据源配置)

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(多数据源配置) 前言多数据源配置引入aop依赖1. properties配置多数据源2. 创建数据源枚举类3. 线程参数配置类4. 数据源动态切换类5. 多数据源配置类HikariCP 版本…

【JS】用哈希法得到四数相加元组数

思路 根据题目这里是四个数组abcd的数相加,将数组两两分组,A大组为ab,B大组为cd由abcd0可得AB0,即B0-A遍历数组分别计算出AB大组所有sum值,先将A组sum值存进map里,再从map里面寻找有count个合适的B值&#…

Python in Excel 正式发布!

Excel 中的 Python 现已正式发布,适用于 Microsoft 365 商业版和企业版的 Windows 用户。去年 8 月,微软与 Anaconda 合作,通过集成 Python 为 Excel 引入了一个令人兴奋的新增功能,从而可以将 Python 和 Excel 分析无缝结合到同一…

使用npm i报错node-sass失败问题解决

node 版本:v14.15.4 解决方法: npm config set sass_binary_sitehttps://npmmirror.com/mirrors/node-sass设置完之后,再npm i 就可以下载成功 亲测有效

MySQL--视图(详解)

目录 一、前言二、视图2.1概念2.2语法2.3创建视图2.3.1目的 2.4查看视图2.5修改数据2.5.1通过真实表修改数据,会影响视图2.5.2通过修改视图,会影响基表 2.6注意2.7 删除视图2.8 视图的优点 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&…

历时一个多月,搭建了一款培训考试小程序系统

前不久,一位在机构单位工作的朋友联系到我,说他们需要搭建一款内部培训考试系统,是关于安全知识学习与考试的。 此处省略好多张聊天页...... 为此,针对用户的需求,在搭建前,我做了大量的竞品分析&#xff…

探索 MicroRabbit:Python 中的通信新纪元

文章目录 探索 MicroRabbit:Python 中的通信新纪元背景:为什么选择 MicroRabbit?MicroRabbit 是什么?如何安装 MicroRabbit?简单的库函数使用方法场景应用示例常见 Bug 及解决方案总结 探索 MicroRabbit:Py…

计算机毕业设计 基于Python的智能停车管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

UML/SysML建模工具更新情况(2024年10月)(1)Rhapsody 10.0.1

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本:SinelaboreRT 6.4 更新时间:2024年9月23日 工具简介 状态机图和活动图代码生成工具。先在EA、Visual Paradigm 、Cadifra、UModel、MagicDraw、…

衡石分析平台系统管理手册-智能运维之系统设置

系统设置​ HENGSHI 系统设置中展示了系统运行时的一些参数,包括主程序相关信息,Base URL、HTTP 代理、图表数据缓存周期、数据集缓存大小、租户引擎等相关信息。 主程序​ 系统设置中展示了主程序相关信息,这些信息是系统自动生成的&#…

AOC商用显示器助力智能制造,赋能数智化发展!

摘要:为制造型企业向数字化、智能化转型提供有力助益! 当今时代,我国制造业呈现出蓬勃发展之势。其中,显示器作为信息呈现的关键载体,其在制造业智能化进程中愈发发挥着重要作用,有助于实时、准确地展示生…

Mysql数据库安装与C++配置

本文档旨在为需要安装和配置MySQL 8.3、MySQL Workbench以及C Connector的用户提供详细的步骤指导。在安装过程中,可能会遇到一些常见问题,如DLL文件缺失等,本指南也会提供相应的解决办法。 1.安装Mysql8.3 安装Mysql有很多教程&#xff0c…