1、浅拷贝

浅拷贝就是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。简单举个例子:

import copya = [1, 2, 3]
b = [3, 4, 5]
c = [a, b]
d = copy.copy(c)

上面代码中,c是对象父级,a和b是对象子级。当使用浅拷贝copy.copy()时,只会对c进行拷贝,不会对a和b进行拷贝。

具体可以进行验证:

import copya = [1, 2, 3]
b = [3, 4, 5]
c = [a, b]
d = copy.copy(c)print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))

通过上面的代码可以发现,c和d的内存地址是不一样的,而子级的内存地址是一样的。

因此可以简单理解,当一个对象有对象父级和对象子级时,浅拷贝只会对对象父级进行拷贝而不会对对象子级进行拷贝。

但是当对象不分父级和子级的时候,浅拷贝就是简单的对对象进行拷贝:

import copya = [1, 2, 3]
b = copy.copy(a)print(id(a))
print(id(b))

这种情况下a和b的内存地址是不一样的。

还需要注意的一种情况是,当对象父级的数据类型为不可变类型,比如是元组时,浅拷贝对象的时候还是引用原对象的地址。

import copya = [1, 2, 3]
b = [3, 4, 5]
c = (a, b)
d = copy.copy(c)print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))

在上面这种情况下,对象父级是一个不可变数据类型,元组。因此在使用浅拷贝的时候,是对原对象的直接引用。因为父级对象是不可变类型,因此如果要修改父级的数据,会重新开辟新的内存空间进行存放,因此浅拷贝引用原对象的地址是没有问题的。

2、深拷贝

深拷贝是对一个对象的所有层次的拷贝,内部和外部都会被拷贝。

简单举个例子:

import copya = [1, 2, 3]
b = [2, 3, 4]
c = [a, b]
d = copy.deepcopy(c)print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))

代码中copy.deepcopy()是对原对象进行深拷贝,这种情况下,对象父级被拷贝,对象子级也会被拷贝,对象之间的内存地址完全不同。

但是深拷贝中需要注意,当对象父级是一个不可变类型,对象子级是一个不可变类型,当使用深拷贝的时候,新对象是对原对象的引用。

import copya = (1, 2, 3)
b = (2, 3, 4)
c = (a, b)
d = copy.deepcopy(c)print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))

代码中的对象父级和子级都是不可变类型,元组。这种情况下,深拷贝得到的新对象是对原对象的引用,两者对应的内存地址是一样的。

深拷贝的作用是在做数据清洗或者数据修改等操作前,对原始数据复制一份,以防数据修改,找不到原数据。

当对象父级和对象子级是不可变类型时,是不能在原始对象上对数据进行修改的,这时候深拷贝对对象的拷贝是引用就可以理解了。因为我是不可变数据,所以怎么对数据进行清洗也不会改变原始数据,所以直接对原对象进行引用就可以了。

Python —— 深拷贝和浅拷贝相关推荐

  1. python深拷贝和浅拷贝的使用场景_Python深拷贝和浅拷贝使用方法

    Python深拷贝和浅拷贝使用方法 发布时间:2020-06-06 16:52:01 来源:亿速云 阅读:182 这篇文章运用了实例代码展示Python深拷贝和浅拷贝使用方法,代码非常详细,可供感兴趣 ...

  2. 【转载】图解 Python 深拷贝和浅拷贝

    伯乐在线 > Python - 伯乐在线 > 所有文章 > 基础知识 > 图解 Python 深拷贝和浅拷贝 图解 Python 深拷贝和浅拷贝 2015/09/28 · 基础 ...

  3. python怎么避免浅拷贝_深度解读Python深拷贝与浅拷贝问题

    Illustrations by Leon Tukker ♚ 作者:PayneLi,Python全家桶,主要讲述数据挖掘.机器学习和深度学习领域的前沿技术,同时还会推荐一些行业最新论文.技术专家的经验 ...

  4. 【233】python—深拷贝与浅拷贝的区别

    ♣ 题目部分(原文见公众号:python宝) python宝 https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU5NjI ...

  5. 一文了解Python深拷贝与浅拷贝问题

    https://www.toutiao.com/a6661446735224635907/ 在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就 ...

  6. Python深拷贝和浅拷贝的区别

    首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 什么是可变对象,什么是不可变对象: 可变对象 ...

  7. python深拷贝和浅拷贝的使用场景_深拷贝、浅拷贝的理解与使用场景

    什么是深拷贝.浅拷贝? 通俗解释:深拷贝是内容拷贝,浅拷贝是地址拷贝 区别点: 深拷贝会创建一个新的内存空间,拷贝的值是一样的,但是内存地址不一样. 浅拷贝只是拷贝指向原来对象的地址,使原对象的引用计 ...

  8. python——深拷贝与浅拷贝的区别

    一.浅拷贝 原列表 data1=[8,24,[2,30,35]] 浅拷贝后的列表 data2=data1.copy()原列表的内存地址 print(id(data1)) 2726096606848 拷 ...

  9. 图解python_图解Python深拷贝和浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will ...

  10. Python 深拷贝和浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will= ...

最新文章

  1. 惠普z840工作站linux,全模块战神 惠普旗舰级Z840工作站评测
  2. php8的jit如何使用,PHP JIT 是什么?PHP8 新特性之 JIT 图文详解
  3. 轰动程序员圈的大事:女程序员将代码写到退休,返聘再续传奇
  4. 第十六届全国大学生智能车竞赛RT-Thread创新专项奖获奖名单
  5. 我的世界:一个村落(其一)
  6. OpenGL 深度测试depth test 的实例
  7. rxjs 里的pipe operator
  8. 一切为了孩子——一位IT麻麻的新西兰移民记录
  9. Oracle下的Databse,Instance,Schemas
  10. EasyExcel入门使用
  11. 构建测试的体系化思维(基础篇)
  12. Vue深入学习1—mustache模板引擎原理
  13. 又是系统时间惹的祸 TreeView
  14. redis在window下的启动
  15. t_user is not mapped [from t_user as u where u.loginname = :loginname and u.password =:password]
  16. SpringBoot自动装配原理,这一篇就够了!
  17. pdffactory 打印字体_PDFFactory
  18. 微信测试是否被删软件,检测微信好友是否把你删除的3种方法,最后一种最好用!...
  19. 《黄帝内经》四季养生法
  20. javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 465;

热门文章

  1. 在Red Hat或CentOS上安装 MongoDB-4.x 社区版
  2. GitHub+Vue自动化构建部署
  3. Linux crontab下关于使用date命令和sudo命令的坑
  4. IntelliJ IDEA开发入门教程
  5. js简单动画:匀速动画、缓动动画、多物体动画以及透明度动画
  6. Visual Studio 2017版本15.9现在可用
  7. C#LeetCode刷题-堆
  8. 令人难以置信的竞争性编程-您无需学习
  9. ubuntu16.04下安装nodejs
  10. ubuntu下安装proxychains