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

    关注

    55

    文章

    4778

    浏览量

    84439

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

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

收藏 人收藏

    评论

    相关推荐

    Python多线程和多进程的区别

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

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

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

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

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

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

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

    Python在AI的应用实例

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

    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

    split在python的用法

    split在python的用法 split()是Python中一个非常常用的字符串函数,它能够根据指定的分隔符将一个字符串分割成多个子字符串,并返回一个包含这些子字符串的列表。本文将详细介绍
    的头像 发表于 12-25 15:12 1964次阅读

    python shell怎么用

    Python Shell是一种交互式解释器,可以通过命令行直接运行Python代码。在Shell,可以输入一行代码并立即得到结果,非常适合于测试、尝试新代码或进行简单的任务。本文将详细介绍
    的头像 发表于 11-29 14:36 1098次阅读

    如何进行零拷贝性能测试

    TogetherROS™·Bot零拷贝性能测试 我们使用TogetherROS™·Bot系统内部集成的性能测试工具——performance_test,来评估下开启零拷贝前后的性能差异,这里我们传输
    的头像 发表于 11-27 16:51 405次阅读
    如何进行零<b class='flag-5'>拷贝</b>性能测试

    什么是零拷贝技术

    在传统操作系统的数据传输过程,系统内部会在磁盘、内存、缓存多次进行数据拷贝,每次都会占用CPU的资源,数据量小的时候还好。 随着数据量的增加,CPU的开销也会持续增加,尤其是在机器人图像数据
    的头像 发表于 11-27 16:20 433次阅读
    什么是零<b class='flag-5'>拷贝</b>技术

    Python2与Python3的差异

    Python2,print语句是一个关键字,而在Python3,print函数被引入,必须使用括号。此外,Python3要求字符串必须使
    的头像 发表于 11-23 16:48 908次阅读

    python嵌入包和安装程序的区别

    中。 在Python,有两种常见的方式来引入和使用第三方扩展功能,即嵌入包和安装程序。本文将详细介绍这两种方式的区别,以及何时应该选择使用哪种方式。 一、嵌入包 概述 嵌入包是将第三方库或框架的源代码直接拷贝到项目的源代码目录
    的头像 发表于 11-23 16:42 8906次阅读

    pythontext的用法

    Python的text是一个常见的数据类型,它用于存储和处理文本数据。在Python,文本常常被表示为字符串(string),字符串是一系列Unicode字符的有序序列。 在
    的头像 发表于 11-23 15:46 3349次阅读