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
    +关注

    关注

    57

    文章

    4857

    浏览量

    89575

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CUBEIDE调试过程,如何将数组仲的数据拷贝到电脑?

    请问,有什么办法可以在CUBEIDE 调试过程,将数组的数据拷贝到电脑上去?
    发表于 09-09 07:20

    基础篇3:掌握Python的条件语句与循环

    Python编程语言中,条件语句和循环是构成复杂逻辑和数据处理的基石。本篇基础教程将帮助您深入了解Python的条件语句和循环结构,让您能够更好地控制程序流程。 条件语句 条件语句允许程序根据
    发表于 07-03 16:13

    使用串口dma环形接收+空闲中断,触发空闲中断后进入任务拷贝数据发现拷贝的数据全为0,怎么处理?

    求助,我使用串口dma环形接收+空闲中断,默认应该开了缓存,在触发空闲中断后进入任务拷贝数据发现拷贝的数据全为0,但是我挂上调试之后在拷贝之前只要打上断点断一次执行之后再执行就正常了
    发表于 03-27 06:17

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之获取内核空间数据

    编译成.ko并拷贝到开发板。 编写测试应用源码copy_to_user.c #include #include #include #include #include #include
    发表于 03-21 14:00

    飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之获取用户空间数据

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/03_内核空间与用户空间的数据拷贝/copy_form_user$ make 将驱动模块编译成.ko并传到开发板
    发表于 03-21 13:58

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之数据拷贝介绍

    空间之间进行数据传输时,需要进行数据拷贝操作。Linux内核提供了几种方法来实现内核空间与用户空间之间的数据拷贝copy_to_user()和copy_from_user()这两个函
    发表于 03-20 11:50

    飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之获取内核空间数据

    /environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/test/03_内核空间与用户空间的数据拷贝/copy_to_user$ make将驱动模块编译成.ko并
    发表于 03-20 11:48

    Python在嵌入式系统的应用场景

    你想把你的职业生涯提升到一个新的水平?Python在嵌入式系统中正在成为一股不可缺少的新力量。尽管传统上嵌入式开发更多地依赖于C和C++语言,Python的优势在于其简洁的语法、丰富的库和快速的开发周期,这使得它在某些嵌入式场景中非常有用,以下是
    的头像 发表于 03-19 14:10 1189次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之数据拷贝介绍

    在Linux系统,内核空间和用户空间是两个独立的地址空间,它们有不同的访问权限和内存保护机制。在内核空间和用户空间之间进行数据传输时,需要进行数据拷贝操作。Linux内核提供了几种方法来实现内核
    发表于 03-19 08:55

    USB3.0移动硬盘拷贝机 如何选 ?

    捷美USB3.2移动硬盘拷贝机专为大规模硬盘复制设计,一次可同时复制40颗硬盘,仅需3.5小时完成,比传统计算机拷贝快500%。采用一键式操作,无需人工监控,降低人力成本。内建bit to bit比对功能,确保数据完整性和安全性。独立运行,开机即用,无需计算机或额外软件,
    的头像 发表于 03-18 17:16 1209次阅读
    USB3.0移动硬盘<b class='flag-5'>拷贝</b>机 如何选 ?

    如何将python文件导入到ROS系统

    本文通过使用myCobot机械臂进行QR码视觉追踪的实践案例分析,介绍如何将 python 文件导入到 ROS 系统
    的头像 发表于 02-11 11:08 1192次阅读
    如何将<b class='flag-5'>python</b>文件导入到ROS系统<b class='flag-5'>中</b>

    四频拷贝遥控器走俏海外

    常有同事反馈和客户沟通时,需要了解客户的遥控器频率才能推荐合适的拷贝遥控器,这就需要客户拆开遥控器查看才能确定,而有些扣位结合的原装遥控器,强行拆开会导致遥控器损坏,对于客户来讲就是得不偿失的事了
    的头像 发表于 02-08 15:34 890次阅读
    四频<b class='flag-5'>拷贝</b>遥控器走俏海外

    FB08 1对7 U盘拷贝格式化机——高效数据复制工具

    FB08 1对7 U盘拷贝格式化机,采用台湾捷美原厂工艺,具备25MB/s的高速拷贝速度和8口同步复制功能,支持加密U盘免解密拷贝及USB 2.0/3.0设备。支持FAT16/FAT32格式化,兼容
    的头像 发表于 02-08 13:51 781次阅读
    FB08 1对7 U盘<b class='flag-5'>拷贝</b>格式化机——高效数据复制工具

    FB16 1对15 U盘拷贝格式化机——高效数据复制工具

    FB16 1对15 U盘拷贝格式化机,采用台湾捷美原厂工艺,具备25MB/s高速拷贝速度和16口同步复制功能,支持加密U盘免解密拷贝及USB 2.0/3.0设备。支持FAT16/FAT32格式化
    的头像 发表于 02-07 17:36 752次阅读
    FB16 1对15 U盘<b class='flag-5'>拷贝</b>格式化机——高效数据复制工具

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

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