0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述Python中深浅拷贝(copy)

马哥Linux运维 来源:CSDN 作者:南枝向暖北枝寒 2021-07-29 16:55 次阅读

在工作中,常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生了拷贝。今天就说一下Python中的深浅拷贝问题。

一、深浅copy

赋值运算

l1 = [1, 2, 3, [22, 33]]l2 = l1l1.append(666)print(l1) # [1, 2, 3, [22, 33], 666]print(l2) # [1, 2, 3, [22, 33], 666]

图解:

913a8f9c-edff-11eb-a97a-12bb97331649.png

注意:l2 = l1是一个指向,是赋值,和深浅copy无关。

浅copy

其实列表是一个一个的槽位,每个槽位存储的是该对象的内存地址

#例1. 给大列表添加元素l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()# 或者下面这种方式,也是浅copy# import copy# l2 = copy.copy(l1)l1.append(666)

print(l1) # [1, 2, 3, [22, 33], 666]print(l2) # [1, 2, 3, [22, 33]]

#例2. 给小列表添加元素l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()l1[-1].append(666)

print(l1) # [1, 2, 3, [22, 33, 666]]print(l2) # [1, 2, 3, [22, 33, 666]]、

例3. 将l1列表中第一个元素改为6l1 = [1, 2, 3, [22, 33]]l2 = l1.copy()l1[0] = 6

print(l1) # [6, 2, 3, [22, 33]]print(l2) # [1, 2, 3, [22, 33]]

小结:

浅copy:会在内存中新开辟一个空间,存放这个copy的列表,但是列表里面的内容还是沿用之前对象的内存地址。

深copy

import copyl1 = [1, 2, 3, [22, 33]]l2 = copy.deepcopy(l1)l1.append(666)print(l1) # [1, 2, 3, [22, 33], 666]print(l2) # [1, 2, 3, [22, 33]]

但是python对深copy做了一个优化,将可变的数据类型在内存中重新创建一份,而不可变的数据类型则沿用之前的,所以内存中是下面这样的:

91dcdfcc-edff-11eb-a97a-12bb97331649.png

小结:

深copy:会在内存中开辟新空间,将原列表以及列表里面的可变数据类型重新创建一份,不可变数据类型则沿用之前的。

为什么Python默认的拷贝方式是浅拷贝?

时间角度:浅拷贝花费时间更少。

空间角度:浅拷贝花费内存更少。

效率角度:浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。

总结:

不可变对象在赋值时会开辟新空间。

可变对象在赋值时,修改一个的值,另一个也会发生改变。

深、浅拷贝对不可变对象拷贝时,不开辟新空间,相当于赋值操作。

浅拷贝在拷贝时,只拷贝第一层中的引用,如果元素是可变对象,并且被修改,那么拷贝的对象也会发生变化。

深拷贝在拷贝时,会逐层进行拷贝,直到所有的引用都是不可变对象为止。

Python 有多种方式实现浅拷贝,copy模块的copy 函数 ,对象的 copy 函数 ,工厂方法,切片等。

大多数情况下,编写程序时,都是使用浅拷贝,除非有特定的需求。

浅拷贝的优点:拷贝速度快,占用空间少,拷贝效率高。

原文链接:https://blog.csdn.net/mall_lucy/article/details/104531218

文章转载:CSDN

(版权归原作者所有,侵删)

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84727

原文标题:图解 Python 中深浅拷贝(copy)

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    M.2硬盘拷贝,该怎么选择适合的工具?FPGA拷贝机到底有没有用?

    探索SP-B1011 M.2 FPGA硬盘拷贝机,一款支持NVMe和SATA接口的高效数据管理工具。无需计算机,即插即用,提供快速拷贝、全盘拷贝和安全抹除模式。适用于个人和专业IT人士,满足各种数据备份和恢复需求。
    的头像 发表于 12-12 11:02 163次阅读
    M.2硬盘<b class='flag-5'>拷贝</b>,该怎么选择适合的工具?FPGA<b class='flag-5'>拷贝</b>机到底有没有用?

    Pythondict支持多个key的方法

    ​ 在Python,字典(dict)是一种非常强大的数据结构,它允许我们通过键(key)来存储和检索值(value)。有时候,我们可能想要根据多个键来检索或操作字典的数据。虽然Python
    的头像 发表于 11-29 15:59 168次阅读

    批量音频档案拷贝最佳方案:解决播放错误与拷贝不完全问题

    本文讨论了在数字化时代,专业SD拷贝机在批量拷贝音频档案至MicroSD卡的应用优势。相较于传统计算机拷贝,SD拷贝机能够完整复制包括隐藏
    的头像 发表于 11-23 16:12 156次阅读
    批量音频档案<b class='flag-5'>拷贝</b>最佳方案:解决播放错误与<b class='flag-5'>拷贝</b>不完全问题

    Python多线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python多线程与多进程的概念、区别以及如何使用线程池与进程池来提高并发执行效率。
    的头像 发表于 10-23 11:48 408次阅读
    <b class='flag-5'>Python</b><b class='flag-5'>中</b>多线程和多进程的区别

    磁盘拷贝机会拷贝删除的内容吗

    磁盘拷贝机,也称为硬盘克隆器或磁盘复制器,是一种用于复制硬盘驱动器内容的设备。它可以将一个硬盘上的所有数据,包括操作系统、程序、文件和设置,复制到另一个硬盘上。这种设备在数据备份、系统迁移、硬盘
    的头像 发表于 10-14 15:38 473次阅读

    如何使用SCP和Rsync远程拷贝文件

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你
    的头像 发表于 09-29 15:54 422次阅读

    怎么导出python边缘计算的APP?

    怎么导出python边缘计算的APP,想进行修改又找不到源码
    发表于 07-25 06:13

    Python在AI的应用实例

    Python在人工智能(AI)领域的应用极为广泛且深入,从基础的数据处理、模型训练到高级的应用部署,Python都扮演着至关重要的角色。以下将详细探讨Python在AI的几个关键应用
    的头像 发表于 07-19 17:16 1125次阅读

    copy table存放的是否为初始值不为0的data段所在PFlash的地址信息?

    1. copy table存放的是否为初始值不为0的data段所在PFlash的地址信息?(比如:int a = 10; 变量a被存放到了PFlash的0x8030001c处,copy table
    发表于 07-02 07:51

    esp32c3怎样保护flash的代码不被拷贝

    想知道这个c3怎样保护flash的代码不被拷贝。这个内置flash的代码有没有可能被拷贝出来,如果可以拷贝,应该怎样保护。 另一个问题
    发表于 06-19 06:32

    瑞芯微开发板copy 安卓图像识别软件copy

    瑞芯微开发板copy,内置安卓图像识别软件,需要copy整个板、系统、识别软件,欢迎有经验的同行洽谈
    发表于 05-29 18:38

    为什么NAND FLASH没有COPY back函数?

    为什么我的NAND FLASH 没有COPY back函数
    发表于 05-10 07:21

    AURIX TC387代码拷贝到DSPR和PSPR执行的区别?

    1. 代码拷贝到DSPR和PSPR执行的区别? 2. DSPR有什么安全机制可以保护拷贝的代码不会被篡改?
    发表于 02-02 06:58

    pythonopen函数的用法详解

    pythonopen函数的用法详解 Python的open()函数用于打开文件。它接受文件名和模式作为参数,并返回一个文件对象。文件对象可用于读取、写入和管理文件。 open()函
    的头像 发表于 01-30 15:31 2141次阅读