当前位置: 首页 > news >正文

Python实战:深拷贝与浅拷贝

1. 引言

在Python中,对象是通过对内存中的数据进行引用来实现的。当我们创建一个对象并将其赋值给另一个变量时,实际上是将这个对象的引用复制给了另一个变量。这意味着,如果原始对象发生改变,引用该对象的变量也会受到影响。为了解决这个问题,Python提供了深拷贝和浅拷贝两种方式来复制对象。

2. 浅拷贝的原理与实现

浅拷贝(Shallow Copy)是指复制一个对象时,只复制对象本身及其包含的元素,但不复制元素所引用的对象。在Python中,可以使用copy模块的copy()函数来实现浅拷贝。
示例1:浅拷贝列表

import copy
list1 = [1, 2, [3, 4]]
list2 = copy.copy(list1)
list1[0] = 0
list1[2][0] = 0
print(list1)  # 输出:[0, 2, [0, 4]]
print(list2)  # 输出:[1, 2, [0, 4]]

在这个示例中,我们对list1进行了浅拷贝,生成了list2。当修改list1的第一个元素时,list2的第一个元素不受影响。但是,当我们修改list1的第三个元素(一个列表)时,list2的对应元素也发生了改变。这是因为浅拷贝只复制了列表本身,但没有复制列表中的元素所引用的对象。

3. 深拷贝的原理与实现

深拷贝(Deep Copy)是指复制一个对象时,不仅复制对象本身,还复制对象所引用的所有对象。在Python中,可以使用copy模块的deepcopy()函数来实现深拷贝。
示例2:深拷贝列表

import copy
list1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)
list1[0] = 0
list1[2][0] = 0
print(list1)  # 输出:[0, 2, [0, 4]]
print(list2)  # 输出:[1, 2, [3, 4]]

在这个示例中,我们对list1进行了深拷贝,生成了list2。当修改list1的第一个元素时,list2的第一个元素不受影响。同样,当我们修改list1的第三个元素(一个列表)时,list2的对应元素也没有发生改变。这是因为深拷贝复制了列表本身以及列表中的元素所引用的对象。

4. 深拷贝与浅拷贝的应用场景

在实际编程中,深拷贝和浅拷贝的应用场景取决于我们对数据的需求。以下是一些常见的应用场景:
(1)当需要复制一个对象,并且不希望原始对象与复制对象之间存在关联时,可以使用深拷贝。
(2)当需要复制一个对象,并且希望原始对象与复制对象共享一部分数据时,可以使用浅拷贝。
(3)在处理大型数据结构时,深拷贝可能会消耗较多的内存和计算资源。在这种情况下,可以考虑使用浅拷贝。

5. 总结

本文详细介绍了Python中的深拷贝与浅拷贝的原理、实现方法以及在实际编程中的应用。通过具体代码示例,我们了解到深拷贝和浅拷贝的区别以及如何选择合适的复制方式。掌握这两种复制方式对于高效地处理Python中的数据结构至关重要。

http://www.lryc.cn/news/324161.html

相关文章:

  • rollup打包起手式
  • 【笔记】语言实例比较 3. 无重复字符的最长子串 C++ Rust Java Python
  • int的大小你知道时4个字节,那么类的大小你知道怎么计算吗?
  • OpenCV学习笔记(十一)——利用Sobel算子计算梯度
  • 扩展一下BenchmarkSQL,新增支持ASE/HANA/DB2/SQLServer,可以随便用了
  • Android 静默安装成功后自启动
  • 计算机二级真题讲解每日一题:《format格式化》
  • RabbitMQ问题
  • flutter->Scaffold左侧/右侧侧边栏和UserAccountsDrawerHeader的使用
  • vulnhub prime1通关
  • JVM快速入门(1)JVM体系结构、运行时数据区、类加载器、线程共享和独享、分区、Java对象实例化
  • CSS3新属性(学习笔记)
  • 41-Vue-webpack基础
  • 数据仓库的分层理论
  • MySQL 8.0-索引- 不可见索引(invisible indexes)
  • Uibot6.0 (RPA财务机器人师资培训第3天 )财务招聘信息抓取机器人案例实战
  • Eureka和Nacos的关系
  • 极简自建web视频会议,私有云,rtmp/rtsp/webrtc一键参会直播会议互动方案
  • 5G智能网关助力工业铸造设备监测升级
  • 奇舞周刊第523期:来自 rust 生态的强烈冲击?谈谈 Leptos 在语法设计上的精妙之处...
  • 《边缘计算:连接未来的智慧之桥》
  • php 各种魔术函数的触发条件
  • Linux的学习之路:2、基础指令(1)
  • 0103设计算法-算法基础-算法导论第三版
  • [NCTF2019]SQLi ---不会编程的崽
  • 上位机开发 halcon坐标转轴坐标
  • [数据结构]二叉树(下)
  • 动手学深度学习|notebook教程
  • C#面:简述 .NET Framework 类库中的“命名空间”
  • android.os.TransactionTooLargeException解决方案,Kotlin