在讲我们深浅拷贝之前,我们需要先区分一下拷贝和赋值的概念。看下面的例子

a = [1,2,3]

赋值:

b = a

拷贝:

b = a.copy()

上面的两行代码究竟有什么不同呢?带着这个问题,继续

看了上面这张图,相信大家已经对直接赋值和拷贝有了一个比较清楚的认识。

直接赋值:复制一个对象的引用给新变量

拷贝:复制一个对象到新的内存地址空间,并且将新变量引用到复制后的对象

我们的深浅拷贝只是对于可变对象来讨论的。 不熟悉的朋友需要自己去了解可变对象与不可变对象哦。

1. 对象的嵌套引用

a = { "list": [1,2,3] }

上面的代码,在内存中是什么样子的呢?请看下图:

原来,在我们的嵌套对象中,子对象也是一个引用。

1. 浅拷贝

如上图所示,我们就可以很好的理解什么叫做浅拷贝了。

浅拷贝:只拷贝父对象,不会拷贝对象的内部的子对象。内部的子对象指向的还是同一个引用

上面 的 a 和 c 是一个独立的对象,但他们的子对象还是指向统一对象

1.1 浅拷贝的方法

  • .copy()

    a = {"list": [1,2,3] }
    b = a.copy()
  • copy模块

    import copy
    a = {"list": [1,2,3] }
    b = copy.copy(a)
  • 列表切片[:]

    a = [1,2,3,[1,2,3]]
    b = a[1:]
  • for循环

    a = [1,2,3,[1,2,3]]
    b = []
    for i in a:b.append(i)

1.2 浅拷贝的影响

a = {"list":[1,2,3]}
b = a.copy()
a["list"].append(4)print(a)
# {'list': [1, 2, 3, 4]}print(b)
# {'list': [1, 2, 3, 4]}

在上面的例子中,我们明明只改变 a 的子对象,却发现 b 的子对象也跟着改变了。这样在我们的程序中也许会引发很多的BUG。

2. 深拷贝

上面我们知道了什么是浅拷贝,那我们的深拷贝就更好理解了。

深拷贝:完全拷贝了父对象及其子对象,两者已经完成没有任何关联,是完全独立的。

import copy
a = {"list":[1,2,3]}
b = copy.deepcopy(a)
a["list"].append(4)print(a)
# {'list': [1, 2, 3, 4]}print(b)
# {'list': [1, 2, 3,]}

上面的例子中,我们再次修改 a 的子对象对 b 已经没有任何影响

3. 手动实现一个深拷贝

主要采用递归的方法解决问题。判断拷贝的每一项子对象是否为引用对象。如果是就采用递归的方式将子对象进行复制。

def deepcopy(instance):if isinstance(instance, dict):return {k:deepcopy(v) for k,v in instance.items() }elif isinstance(instance, list):return [deepcopy(x) for x in instance]else:return instancea = {"list": [1,2,3]}
b = deepcopy(a)print(a)
# {'list': [1, 2, 3]}print(b)
# {'list': [1, 2, 3]}a["list"].append(4)
print(a)
# {'list': [1, 2, 3, 4]}print(b)
# {'list': [1, 2, 3]}

Python对象的浅拷贝与深拷贝相关推荐

  1. 拷贝Python对象、浅拷贝、深拷贝

    浅拷贝和深拷贝在C++中出现和使用的较多,python也有相应的用法. test1 = ['a','c','b','d','f'] print id(test1) test2 = test1 prin ...

  2. Python —对象的浅拷贝和深拷贝

    变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python 拷贝一般都是浅拷贝(copy.copy).拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象会引用同一个子对象 ...

  3. 对象的浅拷贝和深拷贝

    对象的浅拷贝和深拷贝 简要介绍 代码实现 简要介绍 浅拷贝:python拷贝一般都是浅拷贝.拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象引用同一个对象 深拷贝:使用copy模块的deep ...

  4. Python copy模块浅拷贝和深拷贝

    Python copy模块浅拷贝和深拷贝 在开发中,经常涉及到数据的传递,在数据传递使用的过程中,可能会对数据进行修改. 对数据进行处理后,如果在后面的代码中,即需要使用修改之前的数据,也需要使用修改 ...

  5. Python中的浅拷贝和深拷贝(一看就懂!!!)

    浅拷贝和深拷贝一直傻傻的分不清,甚至有时候会理解反.今天就简单总结一下python中的浅拷贝和深拷贝. 总结 最直观的理解就是: 1.深拷贝,拷贝的程度深,自己新开辟了一块内存,将被拷贝内容全部拷贝过 ...

  6. python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...

  7. Python赋值、浅拷贝、深拷贝

    一.赋值(assignment) >>> a = [1, 2, 3] >>> b = a >>> print(id(a), id(b), sep= ...

  8. Python 赋值、浅拷贝、深拷贝的区别?

    http://songlee24.github.io/2014/08/15/python-FAQ-02/ 在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出 ...

  9. Python——赋值、浅拷贝、深拷贝

    和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念有了进一步的了 ...

最新文章

  1. Emgu-WPF学习使用-识别二维码的位置
  2. aryson ms sql_数据治理:SQL数据清洗十八般武艺
  3. Totem-DesignNet处理器插件开发方法
  4. 这年头,胡萝卜也靠不住了
  5. css background size
  6. *【HDU - 2819】Swap(二分图匹配,输出路径)(待证明:是否是最少交换次数?)
  7. pytorch之学习率变化策略之LambdaLR
  8. pycharm编程工具自带python环境_PyCharm配置Python3开发环境
  9. php连接mysql MariaDB_PHP+MariaDB数据库操作基本技巧
  10. drawCircle方法:绘制圆形
  11. 解决M1处理器款mac安装DW闪退问题 Dreamweaver 2021 Mac(已适配M1芯片,支持最新款M1芯片Mac)
  12. 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)
  13. 电脑睡眠后启动 耳机没有声音 手动启动 -已解决
  14. 第一个C编译器的诞生图
  15. Python第八课(函数1)
  16. 机器自动翻译古文拼音 - 十大宋词 - 破阵子 醉里挑灯看剑 辛弃疾
  17. 基于JAVA实现的幼儿园信息管理系统
  18. 天涯网站跨站漏洞(ALLyeSNO)
  19. 【Python】抓取基金数据,这简直太爱了
  20. MP26123DR三节串联锂电池充放电电路

热门文章

  1. 关于我的姓——袁(1)
  2. 惠州学院计算机学院院长,惠州学院计算机科学与工程学院院领导一行来我院参观交流...
  3. RF-测试中常用函数
  4. 怎么在小程序里开店铺?【小程序开店】
  5. python中一般使用几个空格表示缩进_为什么Python pep-8强烈建议使用标签上的空格来缩进?...
  6. 开发右脑,数字桩记忆扑克牌训练教程
  7. Android 极光推送 自定义通知铃声
  8. 基于来信码的短信通知平台
  9. 英语一大作文模板如何自己制作?
  10. 文档化Python代码完全指南(翻译)