浅拷贝.深拷贝
发布网友
发布时间:2022-04-26 10:13
我来回答
共4个回答
懂视网
时间:2022-04-18 11:45
collection模块是对Python的通用内置容器:字典、列表、元组和集合的扩展,它包含一些专业的容器数据类型:Counter(计数器):dict子类,用于计算可哈希性对象的个数。OrderedDict(有序字典):dict 子类,记录着数据成员添加的顺序。defaultdict(默认字典):dict 子类,调用一个工厂函数来为dict的values值缺失提供一个默认值。namedtuple(可命名元组):工厂函数生成有命名字段的tuple子类。deque(双向队列):能在“队列”两端快速出队、入队的函数,类似于队列的(list-like)的容器。ChainMap:为多个映射创建单一视图的类字典类型。UserDict:将字典包裹起来使得创建字典的子类更容易。UserList:将列表对象包裹起来使得创建列表的子类更容易。UserString:将字符串对象包裹起来使得创建字符串的子类更容易
1. 深入了解Python collection模块与深浅拷贝
简介:这篇文章介绍深入了解Python collection模块与深浅拷贝
【相关问答推荐】:
javascript - 引用对象赋值 深浅拷贝 jquery.extend
objective-c - iOS 深浅拷贝?
热心网友
时间:2022-04-18 08:53
浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.
浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。
热心网友
时间:2022-04-18 10:11
拷贝构造函数,经常被称作X(X&),是一种特殊的构造函数,他由编译器调用来完成一些基于同一类的其他对象的构件及初始化。它的唯一的一个参数(对象的引用)是不可变的(因为是const型的)。这个函数经常用在函数调用期间于用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。
在C++中,下面三种对象需要拷贝的情况。因此,拷贝构造函数将会被调用。
1). 一个对象以值传递的方式传入函数体
2). 一个对象以值传递的方式从函数返回
3). 一个对象需要通过另外一个对象进行初始化
以上的情况需要拷贝构造函数的调用。如果在前两种情况不使用拷贝构造函数的时候,就会导致一个指针指向已经被删除的内存空间。对于第三种情况来说,初始化和赋值的不同含义是构造函数调用的原因。事实上,拷贝构造函数是由普通构造函数和赋值操作赋共同实现的。描述拷贝构造函数和赋值运算符的异同的参考资料有很多。
拷贝构造函数不可以改变它所引用的对象,其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环。
除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。换句话说,你从函数返回得到的只是对象的一份拷贝。但是同样的,拷贝构造函数被正确的调用了,你不必担心。
如果在类中没有显式的声明一个拷贝构造函数,那么,编译器会私下里为你制定一个函数来进行对象之间的位拷贝(bitwise copy)。这个隐含的拷贝构造函数简单的关联了所有的类成员。许多作者都会提及这个默认的拷贝构造函数。注意到这个隐式的拷贝构造函数和显式声明的拷贝构造函数的不同在于对于成员的关联方式。显式声明的拷贝构造函数关联的只是被实例化的类成员的缺省构造函数除非另外一个构造函数在类初始化或者在构造列表的时候被调用。
拷贝构造函数是程序更加有效率,因为它不用再构造一个对象的时候改变构造函数的参数列表。设计拷贝构造函数是一个良好的风格,即使是编译系统提供的帮助你申请内存默认拷贝构造函数。事实上,默认拷贝构造函数可以应付许多情况。
热心网友
时间:2022-04-18 11:45
1. 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。
考虑以下写法
int source = int.MaxValue;//(1)初始化源对象为整数的最大值2,147,483,647
int dest = source;//(2)赋值,内部执行深拷贝
dest = 1024;//(3)对拷贝对象进行赋值
source = 2048;//(4)对源对象进行赋值
首先(2)中将source赋给dest,执行了深拷贝动作,其时dest和source的值是一样的,都是int.MaxValue;(3)对dest进行修改,dest值变为1024,由于是深拷贝,因此不会运行source,source仍然是int.MaxValue;(4)对source进行了修改,同样道理,dest仍然是1024,同时int.MaxValue的值也不变,仍然是2,147,483,647;只有source变成了2048。
再考虑以下写法
struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Point source = new Point(10, 20);
Point dest = source;
dest.X = 20
当dest.X属性变成20后,source的X属性仍然是10
2. 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。比较典型的就有Reference(引用)对象,如Class(类)。
考虑以下写法
class Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Point source = new Point(10, 20);
Point dest = source;
dest.X = 20;
由于Point现在是引用对象,因此Point dest=source的赋值动作实际上执行的是浅拷贝,最后的结果应该是source的X字段值也变成了20。即它们引用了同一个对象,仅仅是变量明source和dest不同而已。
参考资料:http://www.cnblogs.com/Phoenix-Rock/archive/2006/11/07/shallowcopy_deepcopy.html
python深拷贝和浅拷贝的区别
在Python中,拷贝操作分为浅拷贝和深拷贝。两者的主要区别在于对复合对象的处理方式。浅拷贝是指创建一个新对象,这个对象有着原始对象的引用类型和数据结构的值。如果原始对象包含其他对象或数据结构,则浅拷贝得到的新对象只复制了这些内部对象的引用,而不复制这些内部对象本身。修改原始对象或内部对象的值...
python深拷贝和浅拷贝的区别
python深拷贝和浅拷贝的区别是:1、直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变。2、copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变。3、深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变。Python的语句不同...
python深拷贝和浅拷贝的区别
1、浅拷贝(shallow copy)所谓“浅拷贝”,是指创建一个新的对象,其内容是原对象中元素的引用。(拷贝组合对象,不拷贝子对象)常见的浅拷贝有:切片操作、工厂函数、对象的copy()方法、copy模块中的copy函数。2、深拷贝(deep copy)所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含...
深拷贝和浅拷贝的区别
1、浅拷贝 浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存 2、深拷贝 深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。二、方法 1、浅拷贝 a、Object.assign()Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝...
什么是深拷贝和浅拷贝
浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于JavaScript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个...
深拷贝、浅拷贝和clone、new方法效率对比
浅拷贝 对基本数据类型进行值传递 对引用数据类型进行引用地址的拷贝 深拷贝 对基本数据类型进行值传递 对引用数据类型,创建一个新的对象,并复制其内容拷贝相关APIObject#clone Java 中所有的对象都是继承自 java.lang.Object。Object 对象中提供了一个 protected 类型的 clone 方法。protected?native?Object?clone()...
浅拷贝与深拷贝的区别
浅拷贝与深拷贝的区别:浅拷贝是指创建一个新对象,这个对象有着原始对象的一些引用类型的属性值的初始引用,也就是说,新对象和原始对象共享某些数据。修改浅拷贝对象的这些引用属性时,会影响到原始对象中的相应数据。但对于对象内部的非引用类型属性,如数字、字符串等,浅拷贝会创建这些属性的独立副本...
面试官:老是问我深浅拷贝问题,自己看文章
面试官常问深浅拷贝问题,深入了解拷贝机制。探索深浅拷贝概念,理解其在对象拷贝中的作用。浅拷贝:复制对象的值,两个变量共享同一存储地址。深拷贝:创建新对象,与原对象无关联,独立存储。比较赋值与深浅拷贝,了解引用关系与独立性。浅拷贝方法:使用Object.assign()、lodash的_.clone方法、展开运算...
什么是深拷贝和浅拷贝
浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象...
Python 5个极易混淆的核心概念!
浅拷贝只拷贝最外层;而深拷贝会拷贝所有层。a = [[3,1,2], [5,4,6]] 浅拷贝意味着修改b的第一层不影响a,但是修改b的第二层会同步影响到a,如下修改第二层会同步影响a from copy import copyIn [8]: b=copy(a)In [9]: b[0][0]=8In [10]: aOut[10]: [[8, 1, 2], [...