拷贝

Python - numpy和list中的浅拷贝和深拷贝

让人想犯罪 __ 提交于 2019-12-08 17:26:36
numpy 中 np.copy() 方法是 深拷贝 ; 切片操作 是 浅拷贝 ; 直接赋值给另一个变量是 浅拷贝 。 # numpy深拷贝示例 In [ 12 ] : arr = np . zeros ( ( 3 , 3 ) ) In [ 13 ] : arr Out [ 13 ] : array ( [ [ 0 . , 0 . , 0 . ] , [ 0 . , 0 . , 0 . ] , [ 0 . , 0 . , 0 . ] ] ) In [ 14 ] : b = arr . copy ( ) In [ 17 ] : b [ 0 , 0 ] = 1 # 更改b的值 In [ 18 ] : arr # arr不变,说明copy()方法是深拷贝 Out [ 18 ] : array ( [ [ 0 . , 0 . , 0 . ] , [ 0 . , 0 . , 0 . ] , [ 0 . , 0 . , 0 . ] ] ) In [ 19 ] : b Out [ 19 ] : array ( [ [ 1 . , 0 . , 0 . ] , [ 0 . , 0 . , 0 . ] , [ 0 . , 0 . , 0 . ] ] ) # numpy浅拷贝示例 In [ 33 ] : b = arr # 直接赋值给变量b In [ 34 ] : b Out [ 34 ] : array

Python中的直接赋值、深拷贝、浅拷贝

杀马特。学长 韩版系。学妹 提交于 2019-12-08 17:26:09
1.直接赋值 直接赋值只是传对象的引用而已,相当于两个变量同时指向一个地方,所以不论这两个变量哪一个改变,他们同时指向的地方都会改变。 list_1 = [1,2,3,[4,5]] list_2 = list_1 print(list_1,list_2) # 对list_2的内容赋值 list_2[0] = 0 print(list_1,list_2) 2.浅拷贝 copy() 当使用浅拷贝时, 只是拷贝了最外围的对象本身,嵌套的内部元素都只是拷贝了一个引用而已。所以外围元素可以独立改变,内部元素其中一个赋值就会引起全部改变。 from copy import copy list_1 = [1,2,3,[4,5]] list_2 = copy(list_1) print('初始情况 : ',list_1,list_2) # 改变外围因素例如list_2中的1、2、3 发现list_1没有改变 list_2[0] = 0 print('改变外围因素:',list_1,list_2) # 改变内部因素例如list2中的[4,5] 发现list_1改变了 因为内部元素浅拷贝只是传引用 list_2[3][0] = 0 print('改变内部因素:',list_1,list_2) 3.深拷贝 deepcopy() 对外围和内部元素都进行了拷贝 对象本身 ,而不是对象的引用。简而言之

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解

我的梦境 提交于 2019-12-08 17:24:58
Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值、复制、浅拷贝、深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表 l1 = [1, 2, 3, 4, 5] # 对l2赋值 l2 = l1 print(l1) l2[0] = 100 print(l1) 示例结果: [1, 2, 3, 4, 5] [100, 2, 3, 4, 5] 可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的“复制”,在Python中,列表属于可变对象,而对可变对象的复制其实就是将列表的内存空间类似C中的指针再次指向新的变量名,而不是诸如字符串这种不可变对象在复制时会创建新的内存空间进行赋值。即此时L1和L2指向的是同一片内存空间,那么怎么实现真正复制呢? 浅拷贝 当列表中的元素为不可变对象时,我们可以用以下方法对列表进行赋值: import copy # 定义一个新列表 L0 = [1, 2, 3, 4, 5] print(L0) print('-'*40) 利用切片 L1 = L0[:] L1[0] = 100 print(L0) 利用模块copy import copy L2 = copy.copy(L0) L2[0] = 100

python对象的深浅拷贝

可紊 提交于 2019-12-08 04:51:56
python对象的赋值实际上是简单的对象引用。也就是说当你创建一个对象然后把它赋值给另一个变量的时候,python并没有拷贝这个对象,而是这个对象的引用。 参考下面的例子: 新建列表li,并把li赋值给li2,此时li与li2的id是相同的。但是当你改变li2时,li也会随之改变。为什么会这样呢?这就是浅拷贝。 对一个对象进行浅拷贝其实是创建了一个类型根原来一样,其内容是原来对象元素的使用,换句话说,这个拷贝对象本身是新的,但它的内容不是。 解决办法: (1)利用完全切片操作: (2)利用工厂函数: (3)使用copy模块的copy.deepcopy()方法: 注意: 1.非容器类型(如数字、字符串和其它’原子‘类型的对象,像代码、xrange函数等)没有拷贝一说。浅拷贝是用完全切片的方式进行的。 2.如果元祖变量只包含原子类型则无深拷贝。 来源: CSDN 作者: tallercc 链接: https://blog.csdn.net/tallercc/article/details/52955303

java对象的浅拷贝和深拷贝

我与影子孤独终老i 提交于 2019-12-08 04:51:27
我们知道,每个对象都有拷贝其对象的能力,是因为每个对象都是一个Object子类,而Object提供clone方法,一个类实现了Cloneable接口就表示该类具备了被拷贝的能力,如果再覆写里面的clone方法就会完全具备拷贝的能力,拷贝是在内存中进行的,所以在性能方面比直接通过new生成对象要快很多,特别是在大对象的生成上,这会使性能的提升非常显著,Object 提供的 clone 方法只是一种浅拷贝方式,也就是说它并不会把对象的所有属性全部拷贝一份,而是有选择性的拷贝,其拷贝规则如下: 基本类型:则拷贝其值 对象:拷贝地址引用,也就是说新拷贝出的对象与原有对象共享该实例变量,不受访问权限的限制。 String 字符串:拷贝的也是一个地址,是个引用,但是在修改时,它会从字符串池 (String pool) 中重新生成新的字符串,原有的字符串对象保持不变,在此我们可以认为 String 是一个基本类型。 下面我们来看一个实例: 定义Person类,让其实现Cloneable接口,并在其中添加相应的属性(名称和父亲)和覆写Object中的clone方法: package com.xin.suggestion; public class Person implements Cloneable{ private String name; private Person father;

java对象深浅拷贝之实现探讨

∥☆過路亽.° 提交于 2019-12-08 04:50:34
Java对象深浅拷贝之实现探讨 1.什么是对象的深浅拷贝 实际项目的开发中,经常会遇到这种情况,在不影响原有对象极其内容的前提下,去产生一个该对象的副本并继续后续的逻辑。此时,就出现对象拷贝的概念。对象拷贝(Object Copy)分为浅拷贝(Shallow Copy))和深拷贝(Deep Copy)。所谓浅拷贝,是指拷贝对象只复制了原对象的引用,,而非其值,换言之,拷贝对象和原对象仍然指向同一个地址和同一个实例。下图可以演示浅拷贝的模型。 我们不难看出,如果使用对象浅拷贝后,我们对拷贝对象进行属性的修改,势必会影响原来的对象。由于浅拷贝存在这样的问题,就产生深拷贝的概念。深拷贝是复制了原对象的值,所以拷贝对象与原对象完全独立,互不影响。深拷贝对象属性的修改不会影响原对象的属性内容。深拷贝的模型可以用下图演示。 2.浅拷贝实现 实现方式1:复制构造方法 package com.wzy.test; /** * @ClassName: ShallowCopyDemo * @Description:复制构造函数实现对象的浅拷贝 * @author: wangzy * @date: 2019年5月11日 下午12:31:12 */ public class ShallowCopyDemo { public static void main(String[] args) { GearBox

Java中对象的浅拷贝与深拷贝

牧云@^-^@ 提交于 2019-12-08 04:49:40
先了解一下什么是浅拷贝和深拷贝,简单来说: 1、浅拷贝,就是增加一个引用,实际还是指向原来的数据内存区。 2、深拷贝,不仅新增一个引用,并且会申请一块内存,引用指向新的内存区。 或者这样理解 1、浅拷贝:浅拷贝只是单纯的对于对象的拷贝,对象属性对于其它对象的引用并没有进行拷贝(也就是说浅拷贝创建的对象和原来对象指向不同的地址空间,但是对象属性里面对其它对象的引用【引用属性】指向的还是同一个地址空间); 2、深拷贝:深拷贝是指拷贝创造出来的对象和原来对象是完全不同的,不仅拷贝创建的对象和原来对象指向的地址不同,引用属性指向的地址空间也是不一样的。如果引用属性里面还含有引用属性,那么该引用属性指向的地址空间也是不同,一次类推……。可以理解成深拷贝是浅拷贝的递归。 来源: CSDN 作者: 零下十五度w 链接: https://blog.csdn.net/u014732103/article/details/79347213

赋值、浅拷贝和深拷贝(数组和对象的深浅拷贝)

ε祈祈猫儿з 提交于 2019-12-08 04:49:29
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的 。 浅拷贝 只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做浅拷贝(浅复制) 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。 赋值和浅拷贝的区别 当我们把一个对象赋值给一个新的变量时, 赋的其实是该对象的在栈中的地址,而不是堆中的数据 。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。 浅拷贝是按位拷贝对象, 它会创建一个新对象 ,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。 我们先来看两个例子,对比赋值与浅拷贝会对原对象带来哪些改变? // 对象赋值 var obj1 = { 'name' : 'zhangsan', 'age' : '18', 'language' : [1,[2,3],[4,5]], }; var obj2 = obj1; obj2

JavaScript - 对象的深浅拷贝

好久不见. 提交于 2019-12-08 04:49:17
今天讲一下JS中对象的拷贝问题。拷贝分为两种:深拷贝与浅拷贝。 两者的区别在于:在对象中的某个属性为引用,浅拷贝只会拷贝这个属性的地址,不会将地址所对应的值也拷贝一份,被拷贝对象与拷贝对象中的这个属性的值指向的是同一个东西,一者进行修改,另一者也会被改变;深拷贝则会将值进行拷贝一份出来,被拷贝对象与拷贝对象对自己中的这个属性的值进行修改,不会影响另一者。 下面来举个例子更深入的理解一下。 首先我们做一下准备工作,创建两个对象: 现在我们来创建一个浅拷贝的方法: 接下来就将浅拷贝的方法代入到对象中进行操作: 预期结果已经确定了,接下来看一下浏览器的执行结果是否与我们的预期结果是否一致: 可以看出浏览器的执行结果与预期结果一致。 至此,我们可以得出浅拷贝方式的结论: 浅拷贝不会对对象里面的引用属性的值进行拷贝 。 现在我们来创建一个深拷贝的方法: 接下来就将深拷贝的方法代入到对象中进行操作: 预期结果已经确定了,接下来看一下浏览器的执行结果是否与我们的预期结果是否一致: 可以看出浏览器的执行结果与预期结果一致。 至此,我们可以得出浅拷贝方式的结论: 深拷贝会对对象里面的引用属性的值进行拷贝 。​ 来源: CSDN 作者: 傻乎乎的熊二 链接: https://blog.csdn.net/wxw20147854/article/details/80995567

对象的浅拷贝与深拷贝理解与多种方式实现——JavaScript

送分小仙女□ 提交于 2019-12-08 04:48:51
对象的浅拷贝: 概念: 浅拷贝就是指拷贝引用,新生成的引用和原来的引用都是指向同一个对象的实例,彼此之间的操作会相互影响。 对象的深拷贝: 概念: 在堆中重新开辟内存,把原引用对应的对象实例中所有的内容进行拷贝,因此保证了深拷贝的对象和原来的对象是完全隔离的,他们之间相互没有影响。 对象的浅拷贝实现 : 直接赋值: let obj = { name:"张三", } let objOne = obj; console.log(objOne===obj); //true 遍历将要复制的对象,对新对象添加其属性(又叫不完全深拷贝或一层拷贝): let obj = { name:"张三", age:"18", adr:"北京", like:{ first:"pingpang", second:"eat", third:"sleep" } } let objOne = {}; for(let i in obj){ if(obj.hasOwnProperty(i)){ //为了不复制原型链里继承的属性 objOne[i]=obj[i]; } } console.log(objOne); //与obj一致 console.log(objOne===obj); //false console.log(objOne.like===obj.like); //true 第二种方式就是进行了一层深拷贝