拷贝

python深拷贝与浅拷贝的区别

你。 提交于 2019-12-01 07:51:21
可变对象:一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值 不可变对象:一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址 copy.copy :浅拷贝,只拷贝父对象,不会拷贝对象内部的子对象 copy.decopy :深拷贝,拷贝对象及其子对象 在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。 import copy a = [1, 2, 3, 4, ['a', 'b', 'c']] b = a c = copy.copy(a) d = copy.deepcopy(a) print(id(a)) print(id(b)) print(id(c)) print(id(d)) a.append

浅拷贝与深拷贝

旧城冷巷雨未停 提交于 2019-12-01 07:06:26
浅拷贝 对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象"里面的对象"。 "里面的对象"会在原来的对象和它的副本之间共享。 引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递。 自带的copy实现浅拷贝。需要实现cloneable接口 深拷贝 不同于浅拷贝,深拷贝是一个整个独立的对象拷贝。如果我们对整个Person对象进行深拷贝,我们会对整个对象的结构都进行拷贝。 将对象序列化为字节序列后,默认会将该对象的整个对象图进行序列化,再通过反序列即可完美地实现深拷贝。 public Object copyObject(Object object) throws IOException, ClassNotFoundException { //创建字节数组输出流将拷贝对象写入 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //创建对象输出流将字节数组输出流传入直接将对象写入字节输出流 ObjectOutputStream objectOutputStrea = new ObjectOutputStream(byteArrayOutputStream); objectOutputStrea.writeObject(object); /

Python中的浅拷贝与深拷贝

二次信任 提交于 2019-12-01 06:10:48
深拷贝与浅拷贝 浅拷贝:只拷贝了一个地址,即和原变量指向同一个地址空间 深拷贝:复制了原变脸指向空间里的内容,并开辟了新的空间 所有的等号赋值是浅拷贝 深拷贝需要用到 copy 模块 深拷贝举例: import copy a = [1, 2, 3, 4] b = copy.deepcopy(a) print("a == b", a == b) print("a is b", a is b) out: a == b True a is b False 几点说明: deepcopy()函数是会递归深拷贝,即比如列表里面有列表会统统深拷贝 注意copy.copy()函数: 如果拷贝的对象是个可变的则只对第一层深拷贝, 如果拷贝的对象是个不可变的(比如:元组)则进行浅拷贝 实例 #!/usr/bin/python # -*-coding:utf-8 -*- import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a a[4].append('c') #修改对象a中的['a', 'b']数组对象 print( 'a = ', a ) print( 'b = ', b )

Java设计模式:Prototype(原型)模式

喜欢而已 提交于 2019-12-01 06:09:13
概念定义 使用原型实例指定待创建对象的种类,并通过拷贝该原型来创建新的对象。Prototype模式允许一个原型对象克隆(复制)出多个与其相同的对象,而无需知道任何如何创建的细节。 应用场景 对象的创建过程较为复杂且需要频繁创建 期望根据现有的实例来生成新的实例,例如: 对象种类繁多而无法整合到一个类时 难以通过指定类名生成实例时 希望解耦框架与生成的实例时 在实际应用中,Prototype模式很少单独出现。经常与其他模式混用。 原型实现 所有Java类都继承自 java.lang.Object ,而Object类提供clone()方法来克隆对象。因此, Java类实现Cloneable接口并重写clone()方法后,即可实现Prototype模式 。 实现Prototype模式的示例代码如下: // 原型类(也可定义为interface Prototype extends Cloneable) abstract class Prototype implements Cloneable { private String name; public void setName(String name) {this.name = name;} public String getName() {return this.name;} public abstract void

SGI-STL简记(六)-序列容器(vector)

强颜欢笑 提交于 2019-12-01 02:03:37
stl_vector.h : vector:可随机访问元素的序列容器,从后插入或删除在常量时间内完成,从首部或中间则需线性时间内完成; _Vector_alloc_base:vector分配基类模板;模板参数分别为数据类型T,分配器类型_Allocator,以及一个bool标识_IsStatic(用于区分是否为标准分配器或SGI分配器); 数据成员: _M_data_allocator:分配器对象; _M_start:保存申请的缓冲区首地址(等同于容器元素的首地址); _M_finish:保存容器内容长度时的尾地址; _M_end_of_storage:保存申请的缓冲区尾地址; 成员函数: 构造函数:分配器引用allocator_type类型以初始化_M_data_allocator; get_allocator:获取分配器对象_M_data_allocator; _M_allocate:通过分配器对象_M_data_allocator分配大小为n个的元素类型大小内存空间; _M_deallocate:释放指定数据元素类型指针地址大小为n个数据元素类型大小的内存空间; 此外还提供特化版本_Vector_alloc_base<_Tp, _Allocator, true>,该分配模板基类内部不再使用分配器对象,而是直接使用simple_alloc的静态成员函数进行分配管理;

深浅拷贝

僤鯓⒐⒋嵵緔 提交于 2019-11-30 19:47:48
目录 copy 模块 1.拷贝(赋值) 1). x为不可变数据类型 2). x为可变数据类型 3). 可变数据类型(比如列表)内,既有不可变元素,又有容器类型可变元素(比如列表) 2.浅拷贝 3.深拷贝 4.拷贝现象总结及画图解释 copy 模块 1.拷贝(赋值) 1). x为不可变数据类型 x = 10 y = x print(x,y) print(id(x),id(y)) x += 1 print(x,y) print(id(x),id(y)) ''' 10 10 1828744960 1828744960 11 10 1828744992 1828744960 ''' ​ 结论:y为x的拷贝对象,x为不可变数据类型,x变化y 不变; 2). x为可变数据类型 x = [1,2,3] y = x print(x,y) print(id(x),id(y)) x += [4] print(x,y) print(id(x),id(y)) ''' [1, 2, 3] [1, 2, 3] 167373768 167373768 [1, 2, 3, 4] [1, 2, 3, 4] 167373768 167373768 ''' ​ 结论:当y为x的拷贝对象,x为可变数据类型,x变化y也变; 3). 可变数据类型(比如列表)内,既有不可变元素,又有容器类型可变元素(比如列表) #

深浅拷贝

吃可爱长大的小学妹 提交于 2019-11-30 19:26:35
#浅拷贝import copylaogong = ["a","b",[1000000,5000000]]# laopo = laogong.copy()# laopo[2][1] -= 1500000# print(laopo)# print(laogong)#深拷贝xiaoshan = copy.deepcopy(laogong)xiaoshan[2][1] -= 1500print(xiaoshan)print(laogong) 来源: https://www.cnblogs.com/TKOPython/p/11637356.html

java按值传递?

一笑奈何 提交于 2019-11-30 18:14:37
原文链接:https://blog.csdn.net/scholar_man/article/details/80900212 在Java中,参数都是按值传递的。被传递到方法中的拷贝值,要不就是一个引用或一个变量,取决于原始参数的类型。从现在开始,下面的几条规则将帮助你理解方法中对于参数的修改怎么影响原始参数变量。 在方法中,修改一个基础类型的参数永远不会影响原始参数值。 在方法中,改变一个对象参数的引用永远不会影响到原始引用。然而,它会在堆中创建了一个全新的对象。(译者注:指的是 包装类和immutable对象 ) 在方法中,修改一个对象的属性会影响原始对象参数。 在方法中,修改集合和Maps会影响原始集合参数。 https://blog.csdn.net/yushanddddfenghailin/article/details/51386120 这一篇讲的明白点 1、需要明白的概念: 堆和栈:Java中基本数据类型的值和对象的引用保存在栈中,具体对象值保存在堆中。 传递原理: 一个方法传递的参数如果是基本数据类型,则是对具体值的拷贝;如果是对象数据类型,则是对对象引用地址值的拷贝,而非具体值拷贝。 、 总结: ①一个方法不能改变传入基本类型的参数值。 ②一个方法不能改变传入对象类型的参数的引用地址。 ③一个方法能够改变传入对象类型的参数某一个属性。 来源: https:/

Java的深拷贝和浅拷贝

旧时模样 提交于 2019-11-30 14:24:26
原文出处: https://www.cnblogs.com/ysocean/p/8482979.html 目录 1、创建对象的5种方式 3、Clone 方法 4、基本类型和引用类型 5、浅拷贝 6、深拷贝 7、如何实现深拷贝?   ①、让每个引用类型属性内部都重写clone() 方法   ②、利用序列化 关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用传递将会有更深的理解。 1、创建对象的5种方式    ①、通过 new 关键字   这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象。比如 Object obj = new Object();    ②、通过 Class 类的 newInstance() 方法   这种默认是调用类的无参构造方法创建对象。比如 Person p2 = (Person) Class.forName("com.ys.test.Person").newInstance();    ③、通过 Constructor 类的 newInstance 方法   这和第二种方法类时,都是通过反射来实现。通过 java.lang.relect.Constructor 类的