deepcopy和copy_python中copy和deepcopy的区别

deepcopy和copy_python中copy和deepcopy的区别Python深浅复制一般对象的复制复杂对象的复制  最近遇到了有关Python中的copy与deepcopy问题,之前再Java里面好像也遇到了深浅复制的问题,但是Python中的深浅复制还不是很熟,就简单了解了一下它们2个的差别,可以供大家参考,不对的地方欢迎大家批评指正。一般对象的复制  针对Python中简单对象的复制,copy和deepcopy…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

  最近遇到了有关Python中的copy与deepcopy问题,之前再Java里面好像也遇到了深浅复制的问题,但是Python中的深浅复制还不是很熟,就简单了解了一下它们2个的差别,可以供大家参考,不对的地方欢迎大家批评指正。

一般对象的复制

  针对Python中简单对象的复制,copy和deepcopy没有什么区别,就是和大家通常理解的复制是一样的,在内存中新开辟一个空间,将原来地址中的数据拷贝到新的地址空间中。说明一下:我们这里所说的简单对象可以理解为最常见的对象,不包含的子对象的对象,也就是包含普通元素(数字,字符串)的对象,下面的一段代码,可以先看一下效果是怎样的。

import copy

if __name__ == '__main__':
    a = [1, 2, 3, 4]
    b = copy.copy(a)
    c = copy.deepcopy(a)  
    print(a == b)
    print(a is b)
    print(a == c)
    print(a is c)

  执行上面的代码,我们可以看到执行结果,深复制和浅复制的执行结果是一样的,并没有什么差别:

True # 说明 a 和 b 所指向的对象的内容相同
False # 说明 a 和 b 所指向的不是同一个对象(地址不同)
True # 说明 a 和 c 所指向的对象的内容相同
False # 说明 a 和 c 所指向的不是同一个对象(地址不同)

  可以用一张图来解释一下,为什么简单对象的深浅复制是一样的。
简单对象的复制
  我们知道,上面的图中,变量a指向一个List对象(或者说是一个List对象的引用),该对象在内存中占用一个地址空间,当简单对象执行copy和deepcopy中的对象时,我们可以看到无论时深复制还是浅复制,都是在内存中新开辟一个地址空间,将原来对象中的内容复制过去,同时让b成为新对象的引用。因此,我们看到a和b指向的对象是不一致的,但是内容是相同的。

复杂对象的复制

  复杂对象可以理解为另外包含其他简单对象的对象,也就是包含子对象的对象,例如:List中嵌套List,或者Dict中嵌套List等,对于复杂对象我们先来看一个简单的程序示例。

import copy

if __name__ == '__main__':
    a = { 
   'name': 'test', 'age': 56, 'address': [1, 2, 3, 4, 5]}
    b = copy.copy(a)
    print(a is b)
    print(a['address'] is b['address'])
    c = copy.deepcopy(a)
    print(a is c)
    print(a['address'] is c['address'])

  看一下上面代码的执行结果:

False  # 说明 a 和 b 不是同一个对象的引用
True   # 说明 a中的address 和 b 中的 address 是同一个对象。黑人问号脸??
False  # 说明 a 和 c 不是同一个对象的引用
False  # 说明 a中的address 和 c 中的 address 不是同一个对象

  下面我通过一张图,来大概解释一下为什么会出现上面的结果。PS:具体对象的对象不一定是按照图中的方式,为了能够说明原理,本图中将子对象的存储空间单独抽出,方便理解。
复杂对象的深浅复制
  我们看到对于复杂对象(包含子对象的对象)的复制,深浅复制在实现原理上就有所不同了。通过上图我们可以看到,复杂对象的深浅复制的区别在于复杂对象的子对象。可以看到:

  1. 对于复杂对象中的简单数据部分,无论是深复制还是浅复制,我们可以看到,Python都是采用的直接在内存中开辟新的地址空间,然后将值复制到新的地址空间。
  2. 对于复杂对象的子对象部分来说:深复制是在内存中开辟一个新的空间,并且将子对象复制到新的地址空间,但是对于浅复制而言,我们可以看到并没有对子对象来开辟空间,通过图看到,新复制的对象和原来的对象同时指向了同一个List对象(也就是同一个对象的引用),所以我们看到a[‘address’]和b[‘address’]同时指向同一个对象。

  上面的内容简单解释了下Python的深浅复制,不对的大家可以批评指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/186892.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • html中三角向下符号,使用css实现三角符号效果[通俗易懂]

    html中三角向下符号,使用css实现三角符号效果[通俗易懂]关于使用css制作三角符号,网上有很多的例子了,在这里只是为了详细的向各位解释一下三角符号的原理下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在css中上下左右的边框相交处并不是一个直线,所以,可以根据此属性进行编写三角符号那么如何使用css的该属性来实现三角符号的效果呢,代码如下:html代码css代码div:after{position:absolute;width…

  • Java获取当前年月日、时间[通俗易懂]

    Java获取当前年月日、时间[通俗易懂]两种方法,通过Date类或者通过Calendar类。Date类比较简单,但是要得到细致的字段的话Calendar类比较方便。importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;importjava.util.L

    2022年10月21日
  • Razor语法大全(cshtml语法)

    Razor语法大全(cshtml语法)本文页面来源地址:http://www.cnblogs.com/dengxinglin/p/3352078.htmlRazor是基于framewor4以上写的一个开源项目:https://github.com/Antaris/RazorEngine/Razor是包含了模板引擎和动态编译两部分。本部分就简单记录了模板引擎的一些语法,之后用Razor做一个代码生成器,就使用Razor的语法来。Razo

  • 随笔:近期仍在流行的QQ盗号网页简析「建议收藏」

    随笔:近期仍在流行的QQ盗号网页简析「建议收藏」前言:被盗号的人们,你们的防护意识有那么弱吗?声明:本文提到的技术,仅可用作网络安全加固等合法正当目的。本文作者无法鉴别判断读者阅读本文的真实目的,敬请读者在本国法律所允许范围内阅读本文,读者一旦因非

  • Python 生成随机数_python 随机字符串

    Python 生成随机数_python 随机字符串python中生成随机数主要使用random模块和numpy库中的random函数。前者主要用于生成随机数和实现序列中随机数和随机数列的挑选,后者用来生成a*b维的随机矩阵。一、random模块random模块中将近有7个函数都是可以用来生成随机数,列举如下:1.random.random()功能:随机生成一个[0,1)的浮点数示例:importrandomnumber=random.random()print(number)print(‘%.2f’%num

  • Web前端和Web后端的区分「建议收藏」

    一、绪论1、前台:呈现给用户的视觉和基本的操作。后台:用户浏览网页时,我们看不见的后台数据跑动。后台包括前端、后端。前端:对应我们写的html、css、javascript等网页语言作用在前端网页。后端:对应jsp、javaBean、dao层、action层和service层的业务逻辑代码。(包括数据库)为什么jsp是后端呢?主要是jsp的运行原理是在tomcat服务器运…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号