浅谈javascript和python语言的深拷贝
深拷贝:
之前在开发中我遇到一个很大的bug,经过我多次调试之后我发现原本应该有保存数据的地方数据全部被清空,仔细一看发现原来是被人为删除,明明操作的是一个副本,为什么原本也会跟着一起被删除呢?经过了解我发现深拷贝这个说法。深拷贝和浅拷贝在js以及python中都是存在的,指定一个数组然后直接让一个变量等于该数组,接着改变该变量的话,指定的数组也会跟着发声改变。如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。
我们来举个浅拷贝例子:
let a=[0,1,2,3,4],
b=a;
console.log(a===b);
a[0]=1;
console.log(a,b);
我发现深拷贝仅对于引用的数据类型诸如数组和对象起作用,但是对于基本数据类型诸如字符串以及数字等没有深浅拷贝这一说法。
引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,我们以上面浅拷贝的例子,当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值。
我们该怎样去实现深拷贝呢:
1.可以递归的循环的去复制相关属性;
2.slice方法,可以使用slice()方法,这样拷贝在一维的数组可以实现深拷贝,但是对于二维数组而言无法实现深拷贝;
3.第三个方法就是使用JSON.stringify()以及JSON.parse()方法,先进性stringify在进行parse,这样得到的也是属于一个深拷贝;
4.使用jq提供的extend方法: let a=[0,1,[2,3],4], b=$.extend(true,[],a); true表示开启深度拷贝,false为浅拷贝;
以上属于js语言的内容,还有python的深拷贝:
python相对比较简单,直接使用copy库,包括copy()以及deepcopy()这2个,c=copy.copy(alist),这样是浅拷贝,只能对一级对象实现深拷贝,二级对象没有实现深拷贝,copy.deepcopy(alist)可以实现完全深度拷贝;
浅谈javascript和python语言的深拷贝的更多相关文章
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- 浅谈javascript的原型及原型链
浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈JavaScript浮点数及其运算
原文:浅谈JavaScript浮点数及其运算 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...
- 浅谈JavaScript中的null和undefined
浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
- [转载]浅谈JavaScript函数重载
原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...
- 【javascript】浅谈javaScript的深拷贝
前言: 最开始意识到深拷贝的重要性是在我使用redux的时候(react + redux), redux的机制要求在reducer中必须返回一个新的对象,而不能对原来的对象做改动,事实上,当时 ...
随机推荐
- Unity Editor(一)OnInspectorGUI的重写与面板的创建
http://blog.csdn.net/husheng0/article/details/52568027
- php多进程pcntl学习(二)
多进程中数据独立,变量无法共享,所以可以使用shmop共享内存实现(cli模式不支持APC扩展),或者存储到redis这种nosql中. 下面实例,开10个进程结合redis集合,做一些简单的任务处理 ...
- update-alternatives命令详解
转载:http://blog.csdn.net/maixia24/article/details/11707289 update-alternatives是ubuntu系统中专门维护系统命令链接符的工 ...
- JAVA里的CAS算法简析
Atomic 从JDK5开始, java.util.concurrent包里提供了很多面向并发编程的类. 使用这些类在多核CPU的机器上会有比较好的性能.主要原因是这些类里面大多使用(失败-重试方式的 ...
- entity_class实体类
对应数据库中表,并继承基础模型类~
- icp算法
https://github.com/tttamaki/ICP-test https://github.com/tttamaki/SICP-test
- google安装于ubuntu14.04 64bit问题
1,下载deb安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 2, 安装程序 su ...
- Java程序设计——对象序列化
对象序列化的目标是将对象保存到磁盘中或允许在网络中直接传输对象,对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,通过网络将这种二进制流传输到另 ...
- dns记录类型(转)
NS:(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终 ...
- gcc支持的一种结构体赋值方式
struct info{ int a; char b; struct fd{ int c; int d; }fg;}; 其实我们也可以这样赋值:同样对于其他的类型也是一样 ...