注册

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

在面向对象的语言中,如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

要回复问题请先登录注册