浅析:对象的浅复制和深复制

问题描述

在面向对象的语言中,如Java/Python,对象的复制有两种形式:浅复制和深复制一、浅复制浅复制只是将原对象的引用备份了一份给新的变量,实际两者指向的是同一个对象。在Python中,字典、列表、元祖等都是对象类型>>> person=['name',]>>> hubby=person>>> wifely=list(person)>>> >>>person是一个列表对象,分割之后赋给hubby,将person显示转为列表对象赋给wifely。这种简单的赋值,就是对象的浅复制—只是copy了一份对象的引用,而实际三个变量均指向同一个对象,对任何一个引用的修改,都会映射到三个对象上。>>> hubby='joe'>>> wifely='jane'>>> hubby,wifely(['joe', ], ['jane', ])>>> hubby=50.00>>> hubby,wifely(['joe', ], ['jane', ])看看person对象的输出:>>> person['name', ]person、hubby、wifely的第二个元素是一个列表对象,当hubby修改该对象的数据时,其影响也同时映射到person、wifely。但为什么修改了第一个,而没有同步映射呢?因为第一个元素是字符串类型,是不可变的;第二个元素是列表对象,是可变的。所以在浅复制时,每次修改字符串内容都是新建了一个对象,在Java中也是如此,而对象只是复制了一个引用。这一点,可以通过id()函数验证,它标识对象的“身份”,就想人的身份证一样#修改值之前>>>>>>#修改值之后>>>>>>从上面对比可知,对字符串的修改都会创建新对象,而在浅复制中,对象的“身份”没有变化,并没有创建新的对象。如果要使person、wifely、hubby不共享一份对象数据呢?那就要进行深复制二、深复制在Python中,实现深复制比较容易,依靠copy模块就行>>> person=['name',]>>> hubby=person #浅复制>>> import copy #引入模块>>> wifely=copy.deepcopy(person) #深复制>>> hubby='joe'>>> wifely='jane'>>> hubby,wifely(['joe', ], ['jane', ])>>>对于字符串的修改各自为政,互不影响。然后,按上述浅复制中的方式同样修改hubby,看会不会影响到wifely>>> hubby=50.00>>> hubby,wifely(['joe', ], ['jane', ])>>>只是改变了hubby中的内容,wifely没有做出相应的映射。可以用id()验证四个对象是不同的>>> >>> >>>

解决方案

你加油吧!!!static/image/common/sigline.gif一个月自然增高2cm,国家专利产品,联系Q或者微信82175487

时间: 2024-10-23 05:35:26

浅析:对象的浅复制和深复制的相关文章

java中对象的浅复制和深复制笔记

在面向对象的语言中,如Java/Python,对象的复制有两种形式:浅复制和深复制 一.浅复制    浅复制只是将原对象的引用备份了一份给新的变量,实际两者指向的是同一个对象.在Python中,字典.列表.元祖等都是对象类型 >>> person=['name',['savings',100.00]] >>> hubby=person[:] >>> wifely=list(person) >>> [id(x) for x in per

android 浅复制和深复制-clone篇

有关java中的 浅复制和深复制 ,这里不详细讨论.相关知识请参考以下帖子: 浅复制和深复制http://blog.csdn.net/yang_hui1986527/article/details/7029777 浅析Java中的深拷贝与浅拷贝http://blog.csdn.net/yang_hui1986527/article/details/7012428 android中的 浅复制和深复制,具体可能于java中的有一点不同.下面,我们来探讨下在这个问题. 主要思路: 1.创建TextBo

深度解析javascript中的浅复制和深复制

     在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有 Number,Boolean,String,Null,Undefined,Object五种类型.而Object又包含Function,Array 和Object自身.前面的五种类型叫做基本类型,而Object是引用类型.可能有人就要问,为什么要分基本类型和引用类型呢?后面你就会明白的.      我们首先来看看浅复制和深复制的简洁定义: 深复制:直接将数据复制给对应的变量 浅复制:将数据的地

举例区分Python中的浅复制与深复制

  这篇文章主要介绍了举例区分Python中的浅复制与深复制,是Python入门学习中的重要知识,需要的朋友可以参考下 copy模块用于对象的拷贝操作.该模块非常简单,只提供了两个主要的方法: copy.copy 与 copy.deepcopy ,分别表示浅复制与深复制.什么是浅复制,什么是深复制,网上有一卡车一卡车的资料,这里不作详细介绍.复制操作只对复合对象有效.用简单的例子来分别介绍这两个方法. 浅复制只复制对象本身,没有复制该对象所引用的对象. ? 1 2 3 4 5 6 7 8 9 1

android 浅复制和深复制-Java Generic Deep Copy 篇

关于Java Generic Deep Copy 在java中的应用和注意事项,请参考:http://blog.csdn.net/yang_hui1986527/article/details/7039425 而关于在android程序中通过clone方法来进行浅复制和深复制,请参考:http://blog.csdn.net/yang_hui1986527/article/details/7036818 众所周知,android上层使用的是java语言,因此理论上于Java Generic De

php中浅复制与深复制的例子

周末闲来无事看到了原型模式,其中谈到了浅复制和深复制,想到PHP中的对应赋值.克隆以及克隆是浅复制还是深复制. 先来看看赋值,例如有一个简历类,有身高和体重两个属性: class Resume  {     public $height;     public $weight;       public $workExperience; } $ResumeA = new Resume(); $ResumeB = $ResumeA; 此时实例化了一个Resume类并赋值给了$ResumeA变量,然

java 浅复制和深复制

原文:http://ttitfly.iteye.com/blog/155422 1.java里的clone分为:  A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象.  b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍.  Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法.必须要遵循下面三点  1.在派生类中覆盖基类的clone()方法,并声明为public[Object类中的clone()方法为protec

Java中对象的深复制和浅复制详解

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用的对象都复制了一遍. 2.Java的clone()方法 ⑴clone方法将对象复制了一份并返回

Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍_java

1.浅复制与深复制概念 ⑴浅复制(浅克隆)      被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆)      被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用的对象都复制了一遍. 2.Java的clone()方法 ⑴clone方法将