浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现(一)

浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现;

copy浅拷贝:没有拷贝子对象,所以原始数据改变,子对象改变

deepcopy深拷贝:包含对象里面的子对象的拷贝,所以原始对象的改变不会造成深拷贝里的任何子元素的改变

Python里的赋值符号“=”只是将对象进行了引用,如果想新开辟进行了引用,如果想新开辟地址new出一个新对象,要用copy模块里copy.copy(),但是用这个方法得到的对象就是新对象,但是数据还是引用。

如果要完全得到一个一模一样的对象,要用copy.deepcopy()方法。这样,在改变更新对象的时候,原对象才能不受影响,也就是保持原始数据不变。

如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象——相当于通过“传值”来传递对象。

Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。

Python提供了3种复制方法,最常见的=、copy.copy()、copy.deepcopy()。下面通过一段代码来看这三种复制方法的异同。

以上运行结果:

打印出了各个对象的ID值,如果id一样,毫无疑问就是同一个对象。当调用默认复制函数时,形参的id和实参的id是相同的,也就是说的同一个对象,而调用copy模块拷贝时形参id和实参id不同,也就是说是不同的对象。注意观察列表中的最后一个dict元素。默认的=复制和copy复制得到的id是相同的,也就是说他们是同一个对象,而deepcopy的id和其他都不一样,也就是说是新对象。

欢迎关注小婷儿的博客:

csdn:https://blog.csdn.net/u010986753

博客园:http://www.cnblogs.com/xxtalhr/

有问题请在博客下留言或加QQ群:483766429 或联系作者本人 QQ :87605025

OCP培训说明连接:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

OCM培训说明连接:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。

小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。

小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。

重要的事说三遍。。。。。。

原文地址:https://www.cnblogs.com/xxtalhr/p/9049197.html

时间: 2024-11-13 06:33:44

浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现(一)的相关文章

关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

大家都知道,在python中复制一个对象有多种方法,其中常用的是赋值.浅拷贝和深拷贝,这三者之间有哪些区别和哪些坑呢? 首先,定义一下: 赋值:  a =1    b =a    a赋值给了b 浅拷贝: a = []  b = a.copy() 或者import copy             b = copy.copy(a) 深拷贝:import copy  a = []   b = copy.deepcopy(a) 未完待续

Python中浅拷贝和深拷贝的区别

Python中浅拷贝和深拷贝的区别 浅拷贝和深拷贝示意图 如上图,简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 数字,字符串是不可变类型 列表,字典是可变类型 我们看下面的案例 案例一:浅拷贝 >>> import copy     #导入copy模块                >>> s=['name',['savings',100.0]] #赋值给s >

python中赋值,浅拷贝,深拷贝的区别

1.首先,对被操作对象分类,对于不可变对象而言,如字符串.数字.tuple等,这三种操作是等价的,都是引用 import copy a='apple'b=ac=copy.copy(a)d=copy.deepcopy(a)print(id(a))print(id(b))print(id(c))print(id(d) 输出: 1840734496184073449618407344961840734496 可见,这四个变量都指向同一块内存地址,即'apple'这个字符串所在的地址 2.对可变对象(或

C# 浅拷贝与深拷贝区别

浅拷贝:给对象拷贝一份新的对象.浅拷贝的定义—— 只对值类型(或string)类型分配新的内存地址.深拷贝:给对象拷贝一份全新的对象.深拷贝的定义—— 对值类型分配新的内存地址,引用类型.以及引用类型的内 http://blog.csdn.net/lai123wei/article/details/7217365 C# 浅拷贝与深拷贝区别,布布扣,bubuko.com

Python中的赋值,浅拷贝和深拷贝的区别

赋值 内存地址的引用,所有的改变都会同步 测试代码 #coding:utf-8 import copy a=['a','b',1,[1,2,3]] b = a #对象赋值,所有改动都会联动 a.append('d') a[0]='aaa' a[3].append(4) print a print b 运行结果 ['aaa', 'b', 1, [1, 2, 3, 4], 'd'] ['aaa', 'b', 1, [1, 2, 3, 4], 'd'] 浅拷贝 str,num等深浅拷贝都一样,list

C# 中浅拷贝与深拷贝区别

转:https://www.cnblogs.com/xugang/archive/2010/09/09/1822555.html 也许会有人这样解释C# 中浅拷贝与深拷贝区别: 浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝. 不能说它完全错误,但至少还不够严谨.比如:string 类型咋说? 其实,我们可以通过实践来寻找答案. 首先,定义以下类型: int .string .enum .struct .class .int[ ] .string[ ] 代码如下:     //枚举     p

js中对象的浅拷贝和深拷贝的区别

js中对象的浅拷贝和深拷贝的区别 浅度拷贝:复制一层对象的属性,并不包括对象里面的为引用类型的数据,当改变拷贝的对象里面的引用类型时,源对象也会改变. 深度拷贝:重新开辟一个内存空间,需要递归拷贝对象里的引用,直到子属性都为基本类型.两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性. 数据的类型: 一般数据(值传递):字符,数值,布尔,undefined 拷贝(复制)时,传递的是值,修改新数据,不会影响老数据 复杂数据(引用传递):对象 拷贝(复制)时,传递的是内存地址的

python直接赋值、浅拷贝与深拷贝的区别解析

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 实例解析 a = {1: [1,2,3]} 1. b = a: 赋值引用,a 和 b 都指向同一个对象,如下图:  2. b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用),如下图:  3. b = copy.deepcopy(a): 需

Object-C的浅拷贝与深拷贝区别

1.要了解浅拷贝与深拷贝,首要的是理解浅拷贝是什么,深拷贝是什么. <1>浅拷贝:就相当于retain,只copy了一个对象的引用,和本身是同一个对象,就相当于影子. <2>深拷贝:从新开辟了一块内存空间,用来存放原来对象里面的东西,这个时候,copy出来的对象和原来的对象不是同一个对象,他们的内容一样,就相当于克隆人. <3>拷贝出来的的对象是什么类型取决于使用什么拷贝. 2.拷贝的用法 <1>不可变copy拷贝不可变对象(浅拷贝): NSArray *a