浅拷贝、深拷贝

在项目中我们经常要处理数据,概括就四个字:增删改查,

我们“增删改查”操作数据其实也就操作内存数据,经常会各种变量互相赋值

那么问题来了,如果是普通的赋值其实也就是简单的浅拷贝数据,

浅拷贝容易被影响数据,深拷贝则不一样。

以下一个小例子:

为什么b数组删除一个下标,a数组也会被影响呢?

这里就涉及到浅拷贝、深拷贝

b数组的内容来自于a数组

如果a直接赋值b那么属于浅拷贝,

虽然它们变量名不一样但内存地址是一样的,

如果某一个变量改变了该内存值,那么其他变量也会受影响

解决方法是用深拷贝,深拷贝直接在内存新建值不受其他变量影响

这里要说说浅拷贝、深拷贝的区别,

浅拷贝:虽然变量名不一样,但实际指向内存地址是一样的

深拷贝:直接在内存新建一份值内存地址也就不一样了

另外JQ的$.extend()方法,等有空也说说自己看法。

其实网上很多技术文章,大神们写得比我好多,但为什么我还是要自己写文章呢?

其实是想从自己角度表达技术的看法。

文笔有限,写这文章目的主要是随笔给自己一个笔记。

原文地址:https://www.cnblogs.com/konghaowei/p/8573729.html

时间: 2024-10-09 05:29:10

浅拷贝、深拷贝的相关文章

JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实例化的的时候就不用对每个实例定义该属性方法,所有的实例均具有该方的引用见最后的输出. function Myclass(){ this.x=" x in Myclass"; this.get=function(){}//每次实例化对象,每个对象的该方法都是独立的,是不相同的 } Mycla

$.extend()浅拷贝深拷贝

参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.extend()指定了一个参数,则意味着参数target被省略.此时,target就是jQuery对象本身.通过这种方式,我们可以为全局对象jQuery添加新的函数.2. 如果多个对象具有相同的属性,则后者会覆盖前者的属性值.   1 <!DOCTYPE html> 2 <html lang=&

Java求幂集与List的浅拷贝深拷贝问题

求幂集 使用回溯法,主要看集合里每一个元素在与不在链表中,在与不在都会创建一个新的解: import java.util.ArrayList; import java.util.List; public class p78 { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> result=new ArrayList<List<Integer>>(

Python练习四-浅拷贝&amp;深拷贝

一.数字.字符串不论是浅拷贝.深拷贝都是指向一个地址. a = 1 b = "abc" print (id(a)) print (id(b)) a1 = a b1 = b print (id(a1),id(b1)) a2 = copy.copy(a) b2 = copy.copy(b) print (id(a2),id(b2)) a3 = copy.deepcopy(a) b3 = copy.deepcopy(b) print (id(a3),id(b3)) 二.列表.元组.字典的浅拷

python浅拷贝深拷贝

copy_list=list[:]  得到的是浅拷贝,即只能顶层拷贝,里面的嵌套不会复制一份. 深拷贝方法如下: import copy a = [0, [1, 2], 3] b = copy.deepcopy(a) a[0] = 8 a[1][1] = 9 int,float,long,str,tuple为不可变对象 list,set,dict为可变对象 不可变对象指的是值的不可变,所以它的每一次操作都会重建对象 打个比方: a=1 a=2 这里虽然看上去a的值可以改变,但其实是创建了一个新的

python之浅拷贝深拷贝

之前一直不明白python中的浅拷贝和深拷贝是个鸟意思,通过一段时间的学习,总算是明白了些,所以就写出来让自己加深点印象,并在与大家分享和交流! #浅拷贝命令 copy.copy(x) Return a shallow copy of x. 返回一个个浅拷贝 x #深拷贝命令 copy.deepcopy(x) Return a deep copy of x. 返回一个深拷贝 x 浅拷贝新创建一个对象并且插入到与之相关的对象或者引用者的身上. 深拷贝同样是创建一个新对象,但是是递归拷贝对象,并且插

Java原型模式之浅拷贝-深拷贝

一.是什么? 浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量仅仅复制引用,不复制引用的对象 深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制 内部机制: (1)关于Object类的clone方法 默认实现为"浅拷贝",重写Object类中的clone方法.Java中全部类的父类都是Object类,Object类中有一个clone方法.作用是返回对象的一个拷贝,可是其作用域是protected类型的,一般的类无法调用,因此Prototype类

python学习笔记七:浅拷贝深拷贝

原理 浅拷贝 import copy b = copy.copy(a) demo: >>> a=[1,['a']] >>> b=a >>> c=copy.copy(a) >>> a [1, ['a']] >>> b [1, ['a']] >>> c [1, ['a']] >>> id(a) 140556196249680 >>> id(b) 14055619624

Python 浅拷贝 深拷贝 及引用机制

这礼拜碰到一些问题,然后意识到基础知识一段时间没巩固的话,还是有遗忘的部分,还是需要温习,这里做份笔记,记录一下 前续 先简单描述下碰到的题目,要求是写出2个print的结果 可以看到,a指向了一个列表list对象,在python中,这样的赋值语句,其实内部含义是指a指向这个list所在内存地址,可以看作类似指针的概念. 而b,注意,他是把a对象包裹进一个list,并且乘以5,所以b的样子应该是一个大list,里面元素都是a 而当a对象进行了append操作后,其实,隐含的意思是,内存中的这个l

关于js 浅拷贝 深拷贝 以及赋值操作。

最近同事又碰到关于深浅拷贝以及赋值的问题,今天我也研究一下记录一下,加深一下记忆. 举一个简单的例子: var people = { age:10, name:"小华", arr:[1,2,3] }; 做一个 赋值操作: var people2 = people; 然后做一个浅拷贝操作: var people3 = {}; for (var i in people){ people3[i] = people[i] }; 然后最后再做一个深拷贝操作: function deepClone