码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python对象复制竟然有这么多种方式,赶紧学起来!


    目录

    1、浅拷贝:copy模块的copy()函数 📋

    1.1 浅拷贝原理揭秘

    1.2 实战演示:列表与字典的浅拷贝

    列表浅拷贝示例

    字典浅拷贝示例

    1.3 注意事项:共享引用与独立对象

    2、深拷贝:copy模块的deepcopy()函数 📌

    2.1 深拷贝实现机制解析

    2.2 深拷贝优势分析

    2.3 深度遍历复制实例

    列表深度拷贝示例

    字典深度拷贝示例

    2.4 陷阱规避:彻底分离原对象

    3、列表切片法 🍏

    3.1 简单快捷的列表复制技巧

    示例代码

    3.2 切片法与其他方法性能对比

    3.3 应用场景与限制条件

    应用场景

    限制条件

    4、对象构造器复刻 🔄

    4.1 通过类的构造函数创建新实例

    示例代码:基本对象复刻

    4.2 应对有自定义__init__方法的对象

    示例代码:带克隆方法的复刻

    4.3通过类方法克隆对象

    实现浅拷贝

    实现深拷贝

    4.4 自定义复制逻辑

    5、序列化与反序列化:pickle模块 🔍

    5.1 对象的存储与恢复

    序列化(Pickling)

    反序列化(Unpickling)

    5.2 性能考量与安全提示

    性能方面

    安全提示

    6、不可变类型复制:无需担忧 🙅‍♀️

    6.1 字符串、元组的“复制”本质

    字符串复制

    元组复制

    6.2 为何不可变对象“复制”无需担忧

    实践意义

    6.3 效率与内存占用分析

    7、高级话题:numpy数组的复制 📊

    7.1 view与copy的区别

    View(视图)

    Copy(拷贝)

    7.2 高性能科学计算中的应用

    8、总结与最佳实践 🏆



    1、浅拷贝:copy模块的copy()函数 📋

    在Python中,对象的复制是一个常见需求,尤其是在处理复杂数据结构时。浅拷贝通过copy模块的copy()函数实现,它创建原始对象的一个新实例,但这个新实例内部的子对象仍然是对原对象子对象的引用。这节将深入探讨浅拷贝的工作原理,并通过实战示例展示其在列表与字典中的应用,同时指出使用过程中需要注意的共享引用问题。

    1.1 浅拷贝原理揭秘

    浅拷贝的核心在于创建一个新对象,该对象的顶层结构是原始对象的精确副本,但对于嵌套的可变对象(如列表内的列表、字典内的字典等),新旧对象将共享这些嵌套对象的引用。这意味着,修改新对象中的顶层元素不会影响原对象,但直接修改嵌套对象则会影响两个对象。

    1.2 实战演示:列表与字典的浅拷贝

    列表浅拷贝示例
    1. import copy
    2. original_list = [1, 2, [3, 4]]
    3. shallow_copy_list = copy.copy(original_list)
    4. print("Original List:", original_list)
    5. print("Shallow Copy List:", shallow_copy_list)
    6. original_list[2][0] = 'Modified'
    7. print("\nAfter modifying nested element in original list:")
    8. print("Original List:", original_list)
    9. print("Shallow Copy List:", shallow_copy_list)

    输出结果:

    1. Original List: [1, 2, [3, 4]]
    2. Shallow Copy List: [1, 2, [3, 4]]
    3. After modifying nested element in original list:
    4. Original List: [1, 2, ['Modified', 4]]
    5. Shallow Copy List: [1, 2, ['Modified', 4]]

    从输出可见 ,修改原列表中的嵌套列表元素后,浅拷贝列表中的对应元素也随之改变,体现了浅拷贝的特性。

    字典浅拷贝示例
    1. original_dict = {'a': 1, 'b': {'c': 2}}
    2. shallow_copy_dict = copy.copy(original_dict)
    3. print("Original Dict:", original_dict)
    4. print("Shallow Copy Dict:", shallow_copy_dict)
    5. original_dict['b']['c'] = 'Altered'
    6. print("\nAfter altering nested value in original dict:")
    7. print("Original Dict:", original_dict)
    8. print("Shallow Copy Dict:", shallow_copy_dict)

    输出结果:

    1. Original Dict: {'a': 1, 'b': {'c': 2}}
    2. Shallow Copy Dict: {'a': 1, 'b': {'c': 2}}
    3. After altering nested value in original dict:
    4. Original Dict: {'a': 1, 'b': {'c': 'Altered'}}
    5. Shallow Copy Dict: {'a': 1, 'b': {'c': 'Altered'}}

    同样地 ,字典中嵌套字典的修改也影响到了浅拷贝字典的对应内容 ,再次证明了浅拷贝的浅层次复制特性。

    1.3 注意事项:共享引用与独立对象

    使用copy.copy()时,重要的是要意识到哪些对象会被共享引用。对于不可变类型(如字符串、数字、元组) ,由于它们不可更改,所以无论深浅拷贝都不会有问题。然而 ,对于可变类型的嵌套结构 ,开发者必须小心 ,因为浅拷贝可能导致意外的数据同步。

    为了避免这种情况 ,当需要完全复制一个包含多层嵌套结构的对象时,应考虑使用copy.deepcopy()函数进行深拷贝,确保每个层级的对象都是独立的新实例。

    2、深拷贝:copy模块的deepcopy()函数 📌

    在Python中处理复杂数据结构时,浅拷贝可能不足以满足完全独立复制对象的需求 ,此时copy模块提供的deepcopy()函数便显得尤为重要。这一章将深入探讨深拷贝的优势、具体实现过程 ,并阐述如何有效避免因对象引用带来的潜在陷阱。

    2.1 深拷贝实现机制解析

    copy.deepcopy()函数通过递归地遍历对象的所有层次来实现深拷贝。这一过程包括以下几个步骤:

    • • 初始化:检查待拷贝对象的类型,确定拷贝策略。

    • • 递归拷贝:对于简单数据类型 ,直接复制值;对于复杂类型(如列表、字典) ,创建新容器,并递归地对每个元素调用deepcopy()。

    • • 处理循环引用:在递归过程中,通过维护一张“备忘录”字典记录已拷贝过的对象 ,遇到相同的引用时直接返回已拷贝的对象,避免无限循环。

    2.2 深拷贝优势分析

    深拷贝通过递归地复制原对象及其所有子对象,确保新旧对象之间完全独立,即使嵌套结构中的元素也不会共享。这种机制提供了几个关键优势:

    • • 数据隔离:修改深拷贝后的对象不会影响原对象,这对于需要保护原始数据完整性或进行并行处理的场景极为关键。

    • • 一致性控制:在多线程或并发环境下,深拷贝可以减少竞态条件,确保每个线程处理的是数据的一个独立视图。

    • • 模型复用与实验:在构建和测试算法模型时,深拷贝允许用户基于同一初始状态快速创建多个可独立修改的实例。

    2.3 深度遍历复制实例

    列表深度拷贝示例
    1. import copy
    2. original_list = [1, 2, [3, 4]]
    3. deep_copy_list = copy.deepcopy(original_list)
    4. # 修改顶层元素
    5. deep_copy_list[0] = 'X'
    6. print("修改后 deep_copy_list:", deep_copy_list)
    7. print("原列表 original_list:", original_list)
    8. # 修改嵌套列表
    9. deep_copy_list[2][0] = 'Y'
    10. print("再次修改后 deep_copy_list:", deep_copy_list)
    11. print("原列表 original_list不受影响:", original_list)

    通过对比输出,我们可以观察到深拷贝后,无论顶层还是嵌套层次的修改都不会影响原对象。

    字典深度拷贝示例
    1. original_dict = {'a': 1, 'b': {'c': 2}}
    2. deep_copy_dict = copy.deepcopy(original_dict)
    3. # 修改顶层键值
    4. deep_copy_dict['a'] = 'A'
    5. print("修改后 deep_copy_dict:", deep_copy_dict)
    6. print("原字典 original_dict:", original_dict)
    7. # 修改嵌套字典
    8. deep_copy_dict['b']['c'] = 'C'
    9. print("再次修改后 deep_copy_dict:", deep_copy_dict)
    10. print("原字典 original_dict不受影响:", original_dict)

    同样,字典的深拷贝保证了即使是嵌套结构中的改变也不会波及原字典。

    2.4 陷阱规避:彻底分离原对象

    尽管深拷贝提供了强大的独立性,但在处理循环引用或特殊对象(如文件句柄、数据库连接等)时,仍需谨慎:

    • • 循环引用:深拷贝能够处理简单的循环引用,但复杂的循环结构可能导致效率降低或栈溢出。在设计数据结构时,应尽量避免不必要的循环引用。

    • • 非纯数据对象:对于具有副作用或状态的对象(如文件、网络连接、数据库游标等) ,深拷贝可能无法正确复制其状态或行为,这时可能需要自定义复制逻辑。

    通过深入理解深拷贝的原理与实践,开发者能够更有效地管理对象生命周期,避免意料之外的数据交互 ,从而提升代码的稳定性和可维护性。

    3、列表切片法 🍏

    列表切片是Python中一种简洁而高效的方式,用于快速复制列表或其部分元素。这种方法不仅代码简洁,执行速度快 ,而且无需引入额外模块,是处理简单复制任务的理想选择。

    3.1 简单快捷的列表复制技巧

    切片法是Python中一种快速且简洁的复制列表方式。其基本语法是利用索引切片操作,即使不指定开始和结束索引,也能实现列表的完全复制。具体来说,list[:]即可创建原列表的一个全新副本。这种方法

  • 相关阅读:
    水果店怎么样开才能赚钱,怎样开水果店赚钱
    【实战】流动的箭头 —— 线性流动组件(repeating-linear-gradient,@keyFrames)
    实践小记——C#格式化小数输出
    【LeetCode力扣】42.接雨水(困难)
    牛客网刷题训练(二)
    让你真实的看见 TCP 三次握手和四次挥手到底是什么样!
    二叉树的中序遍历
    大数据概述、前世今生、处理流程、学习路线、开发工具详解
    文件管理模块总结
    【Hive-SQL】Hive Select 选择语句排除一列或多列
  • 原文地址:https://blog.csdn.net/xyh2004/article/details/139738079
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号