拷贝

清晰明了的深浅拷贝

别说谁变了你拦得住时间么 提交于 2019-12-21 13:10:56
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。 下面本文就通过简单的例子介绍一下这些概念之间的差别。 对象赋值 直接看一段代码: will = ["Will", 28, ["Python", "C#", "JavaScript"]] wilber = will print id(will) print will print [id(ele) for ele in will] print id(wilber) print wilber print [id(ele) for ele in wilber] will[0] = "Wilber" will[2].append("CSS") print id(will) print will print [id(ele) for ele in will] print id(wilber) print wilber print [id(ele) for ele in wilber] 代码的输出为: 下面来分析一下这段代码: 首先,创建了一个名为will的变量,这个变量指向一个list对象,从第一张图中可以看到所有对象的地址(每次运行,结果可能不同) 然后,通过will变量对wilber变量进行赋值,那么wilber变量将指向will变量对应的对象(内存地址),也就是说"wilber

常用拷贝信息,深拷贝数据,加密,解密

。_饼干妹妹 提交于 2019-12-21 11:56:46
import CryptoJS from "crypto-js"; const CRYPTOJSKEY = "zhouzhenrongqq12"; class PublicMethod { /** * 复制文本 * @param text 复制的内容 */ static copy(text) { const oInput = document.createElement("input"); oInput.value = text; document.body.appendChild(oInput); oInput.select(); // 选择对象 document.execCommand("Copy"); // 执行浏览器复制命令 oInput.className = "oInput"; oInput.style.display = "none"; } /*** * 加密 * @param plaintText 加密字符串 * @returns {string} */ static encrypt(plaintText) { const options = { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }; const key = CryptoJS.enc.Utf8.parse(CRYPTOJSKEY); const

数组模板类-MyVector

余生长醉 提交于 2019-12-21 07:09:18
实现非常简单的数组模板类(MyVector)中用到了泛型编程(模板类编程)、运算符重载、友元函数等知识,最重要的是加深了对内存分配的理解。 所有容器提供的都是值(value)语意,而非引用(reference)语意。 容器执行插入元素的操作时,内部实施拷贝动作。 所以STL容器内存储的元素必须 能够被拷贝 (必须提供拷贝构造函数)。 开始的时候不理解这句话,然后自己敲代码就理解了。我们在往容器里存数据的时候,是进行拷贝动作,也就是说将外部变量的值拷贝给容器中的值。要进行拷贝就必须分配内存,没有分配内存的话往哪拷数据呢????而基础数据类型的变量是不用担心这些问题的,因为当我们写下 int a 时编译器已经为 a 分配了内存,但是如果是指针变量就必须考虑深拷贝与浅拷贝的问题(其实这个地方第一次的时候我想的是,MyVector不是已经分配了内存了吗,为什么还要分配呢?其实在MyVector中是给类分配了内存说白了就是给类中的成员变量分配了内存,而成员变量若有指针的话,它只是为指针分配了内存,而我们所需要的是分配指针所指向的内存空间分配内存)。 MyVector.h # pragma once # include <iostream> using namespace std ; template < typename Type > class MyVector { friend

python list的深拷贝浅拷贝

假如想象 提交于 2019-12-21 06:07:27
list1 = list2 [ : ] list1 = list2 . copy ( ) ''' 这里的深拷贝是指列表第一层的深拷贝!!! 针对嵌套列表为了深拷贝,采用如下方式: ''' import copy list1 = copy . deepcopy ( list2 ) 来源: CSDN 作者: 瓜瓜瓜皮XUE 链接: https://blog.csdn.net/github_36570274/article/details/103605673

云存储答案

混江龙づ霸主 提交于 2019-12-21 05:04:21
文章目录 一、存储架构(DAS、NAS、SAN) 1. 云存储的分类 2. 云存储系统架构 3.三种架构比较 4. 分别是如何访问的 5.三种存储架构的优缺点 二、硬盘接口、内部结构 1、硬盘相关术语以及三维坐标 2、硬盘容量的计算 3、硬盘的接口类型 4、存储系统评价指标 三、数据保护 1、RAID相关知识 2、数据保护的方法 四、分布式存储系统 1、有哪四类分布式存储系统 2、Hadoop的组成部分 3、HDFS 5、分布式数据库有哪几类节点? 五、云存储的实现架构 一、存储架构(DAS、NAS、SAN) 1. 云存储的分类 非可管理型云存储 面向 普通用户 限定了存储容量和使用方式 使用成本低 操作简单 可管理型云存储 主要面向 开发人员 将存储空间呈现为原生磁盘,提供给用户进行配置和管理 2. 云存储系统架构 3.三种架构比较 存储架构 组成部分 数据类型 典型应用 DAS(直连附加存储) 服务器,SAS线,存储设备 块级 任何 NAS(网络附加存储) 服务器,网络,存储设备 文件级 文件服务器 SAN(区域网络存储) 服务器,网络,存储设备 块级 数据库应用 4. 分别是如何访问的 DAS使用FC,SCSI,SAS线直接进行连接 NAS通过 NFS (Linux)或者是 CIFS (windows)协议去访问网络文件 SAN通过以太网或者是FC进行连接

Javascript中的深拷贝和浅拷贝

荒凉一梦 提交于 2019-12-20 20:34:15
文章目录 JavaScript中的变量类型 深拷贝和浅拷贝的理解 深拷贝和浅拷贝的实现方式 为什么需要深拷贝和浅拷贝 JavaScript中的变量类型 (1)、基本类型   JavaScript中的基本类型有五种: null、undefined、boolean、string、number。 变量是按值存放的,存放在栈中的简单数据段,可以直接访问。 (2)、引用类型   引用类型包括对象和数组,其存储在堆当中,而变量是指针,指向堆。 当我们访问的时候,实际上是访问指针,然后指针去寻找对象或数组。 深拷贝与浅拷贝的理解 (1)、深拷贝   先新建一个空对象,内存中新开辟一块地址,把被复制对象的所有可枚举的(注意可枚举的对象)属性方法一一复制过来,注意要用 递归 来复制子对象里面的所有属性和方法,直到子子.....属性为基本数据类型。 关键点 :开辟新内存、递归复制。   另外一种定义:深拷贝指的是对象属性所引用的对象全部进行新建对象复制,以保证深复制的对象的引用图不包含任何原有对象或对象图上的任何对象,隔离出两个完全不同的对象图。 (2)、浅拷贝   一个对象复制另外一个对象,如果不是深拷贝,就是浅拷贝。 简单地说,浅拷贝就是将一个对象的内存地址的“”编号“”复制给另一个对象。即在真正访问的时候还是会访问到被复制对象。 或者只是深拷贝了第一层的引用类型,而没有拷贝更深层次的应用类型

java知识回顾

佐手、 提交于 2019-12-20 20:24:24
一、构造方法能不能被继承   当然不能,1.构造方法是类的唯一入口        2.构造方法与类名相同        3.子类构造方法中隐式的调用了父类的构造方法 二、值传递和引用传递、不变类和可变类、直接赋值和浅拷贝和深拷贝    1.直接赋值:在java中,对象的传递、方法参数的传递(将实参赋值给行参)多数是通过=来直接赋值的 值传递是值的copy 引用传递是引用的copy,即内存地址的copy 引用传递又分两种 1.如果是不变类 对引用的操作不会改变原引用地址,但会改变现引用地址的值,他们指向不同的对象(new对象除外)    2.如果是可变类 对引用的操作不会改变原引用地址,但会改变对象的值,他们指向的是同一个对象(new对象除外)            3.不管是可变不可变,只要使用new来重新赋值,则是一个新的引用与对象,不会修改原来的引用与对象 2.浅拷贝:对象实现cloneable接口,重写clone类,可以拷贝对象内的基本数据类型以及不变类型,引用类型不会被拷贝    3.深拷贝:对象中的引用类型也实现cloneable接口。。。         修改引用时new新的对象,如get、set时         序列化(腌酸菜、冷藏)    可变类:提供修改自身的方法,不可变类:要修改对象时必须new一个对象,如 String、基本类型的包装类、BigInteger

JS实现对象数组的深拷贝

帅比萌擦擦* 提交于 2019-12-20 16:01:22
由于对象和数组属于引用类型,所以在给对象赋值时,通常不能使用“=”进行赋值,实质上它们指向了同一个引用地址,如下: var testParams = { name : 'hh' , childParam : { name : '666' , age : '20' } , myArr : [ 1 , 2 , 3 , 4 ] } var bigParamsCopy = bigParams ; console . log ( bigParamsCopy ) console . log ( bigParams ) ; 运行结果如图,原对象bigParams的值也改变了 主要函数实现 //obj为传入的需要拷贝的对象 function deepCopy ( obj ) { var newObj = { } ; //使用for in遍历对象 for ( k in obj ) { //判断对象属性是否为Object或者Array if ( typeof obj [ k ] == 'object' ) { //递归调用方法返回拷贝对象 newObj [ k ] = deepCopy ( obj [ k ] ) ; } else { newObj [ k ] = obj [ k ] ; } } return newObj ; } //example var testParams = { name :

浅拷贝&深拷贝

僤鯓⒐⒋嵵緔 提交于 2019-12-20 10:35:51
什么是深拷贝和浅拷贝 首先需要明白,浅拷贝和深拷贝都是针对一个已有对象的操作。那先来看看浅拷贝和深拷贝的概念。 在 Java 中,除了基本数据类型(元类型)之外,还存在 类的实例对象 这个引用数据类型。而一般使用 『 = 』号做赋值操作的时候,对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上还是指向的同一个对象。 而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。 所以到现在,就应该了解了,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不同操作而已。 浅拷贝的实现 实现对象拷贝的类,需要实现 Cloneable 接口,并覆写 clone() 方法。 public class Subject { private String name ; public Subject ( String name ) { this . name = name ; } public String getName ( ) { return name ; } public

C++之构造函数拷贝

蓝咒 提交于 2019-12-20 03:30:26
拷贝构造函数,顾名思义,就是通过拷贝对象的方式创建一个新对象。拷贝构造函数有两种原型(我们继续以book类来说明拷贝构造函数原型): book(book &b); book(const book &b); //下面一种原型则规定在创建新对象的时候不得修改被拷贝的对象 这两种原型都是book类对象的引用。下面一种原型则规定在创建新对象的时候不得修改被拷贝的对象。 如果拷贝构造函数的参数不是对象的引用,则是不允许的 。如下面这种构造函数形式则是无法编译通过的。 book(book b); //无法编译过去 为什么拷贝构造函数的参数一定要是对象的引用呢?我们可以想一下,如果不是引用,而是通过传值的方式将实参传递给形参,这中间本身就要经历一次对象的拷贝的过程,而对象拷贝则必须调用拷贝构造函数,如此一来则会形成一个死循环,无解。所以拷贝构造函数的参数必须是对象的引用。 拷贝构造函数除了能有对象引用这样的参数之外,同样也能有其它参数。但是其它参数必须给出默认值。例如下面这种拷贝构造函数声明方式。 book(const book &b, price = 5.0); 如果类的设计人员不在类中显示的声明一个拷贝构造函数,则系统会自动地为类生成一个拷贝构造函数, 自动生成的拷贝构造函数功能简单,只能将源对象的所有成员变量 一一复制给当前创建的对象。 class book { public: book(