python deep copy and shallow copy
Python中对于对象的赋值都是引用,而不是拷贝对象(Assignment statements in Python do not copy objects, they create bindings between a target and an object.)。对于可变对象来说,当一个改变的时候,另外一个不用改变,因为是同时的,也就是说是保持同步的。
此时不想让他们同步的话可以使用copy模块,copy.copy()浅拷贝,copy.deepcopy()深拷贝。
前者是对整个对象的拷贝,对子对象仍然是引用,后者是对对象以及子对象的拷贝。具体一些可以下面例子:
In [26]: import copy [6/165] In [27]: a = [1, 2, [3, 4]] In [28]: b = a # 引用 In [29]: c = copy.copy(a) # shallow copy, 对1,2,【3,4】拷贝,对【3,4】中的元素是引用 In [30]: d = copy.deepcopy(a) # deep copy 对1,2,【3,4】都是拷贝,【3,4】中的元素也是拷贝 In [31]: b
Out[31]: [1, 2, [3, 4]] In [32]: c
Out[32]: [1, 2, [3, 4]] In [33]: d
Out[33]: [1, 2, [3, 4]] In [34]: a.append(5) In [35]: a
Out[35]: [1, 2, [3, 4], 5] In [36]: b
Out[36]: [1, 2, [3, 4], 5] In [37]: c
Out[37]: [1, 2, [3, 4]] In [38]: d
Out[38]: [1, 2, [3, 4]] In [39]: a[2].append(6) In [40]: a
Out[40]: [1, 2, [3, 4, 6], 5] In [41]: b
Out[41]: [1, 2, [3, 4, 6], 5] In [42]: c
Out[42]: [1, 2, [3, 4, 6]] In [43]: d
Out[43]: [1, 2, [3, 4]]
一些对象的浅拷贝可以通过其他方式实现,如字典可以使用 dict.copy(),列表使用listb = lista[:],如下:
In [46]: a = {'name': 'wang',} In [47]: b = dict.copy(a) In [48]: b
Out[48]: {'name': 'wang'} In [49]: a.update({'age': 13}) In [50]: a
Out[50]: {'age': 13, 'name': 'wang'} In [51]: b
Out[51]: {'name': 'wang'} In [52]: a = {'name': {'first_name': 'wang'}} In [53]: b = dict.copy(a) In [54]: b
Out[54]: {'name': {'first_name': 'wang'}} In [55]: a['name'].update({'last_name': 'Emma'}) In [56]: a
Out[56]: {'name': {'first_name': 'wang', 'last_name': 'Emma'}} In [57]: b
Out[57]: {'name': {'first_name': 'wang', 'last_name': 'Emma'}} In [58]: lista = [1, 2] In [59]: listb = lista[:] In [60]: lista.append(3) In [61]: lista
Out[61]: [1, 2, 3] In [62]: listb
Out[62]: [1, 2] In [63]: lista = [1, 2, [3, 4]] In [64]: listb = lista[:] In [65]: lista[2].append(5) In [66]: listb
Out[66]: [1, 2, [3, 4, 5]]
注意:
深拷贝浅拷贝都不能拷贝文件,模块等类型(This module does not copy types like module, method, stack trace, stack frame, file, socket, window, array, or any similar types. It does “copy” functions and classes (shallow and deeply), by returning the original object unchanged;)
同时可以自定义这两个函数~
参考:
https://docs.python.org/2/library/copy.html
http://www.cnblogs.com/coderzh/archive/2008/05/17/1201506.html
http://blog.csdn.net/sharkw/article/details/1934090
python deep copy and shallow copy的更多相关文章
- [CareerCup] 13.4 Depp Copy and Shallow Copy 深拷贝和浅拷贝
13.4 What is the difference between deep copy and shallow copy? Explain how you would use each. 这道题问 ...
- Summary: Deep Copy vs. Shallow Copy vs. Lazy Copy
Object copy An object copy is an action in computing where a data object has its attributes copied t ...
- deep copy and shallow copy
链接A:浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当值拷贝的时候,两个对象就有用共同的资源,同时对资 ...
- python中的shallow copy 与 deep copy
今天在写代码的时候遇到一个奇葩的问题,问题描述如下: 代码中声明了一个list,将list作为参数传入了function1()中,在function1()中对list进行了del()即删除了一个元素. ...
- 由Python的浅拷贝(shallow copy)和深拷贝(deep copy)引发的思考
首先查看拷贝模块(copy)发现: >>> help(copy)Help on module copy:NAME copy - Generic (shallow and dee ...
- Shallow copy and Deep copy
Shallow copy and Deep copy 第一部分: 一.来自wikipidia的解释: Shallow copy One method of copying an object is t ...
- shallow copy 和 deep copy 的示例
本文属原创,转载请注明出处:http://www.cnblogs.com/robinjava77/p/5481874.html (Robin) Student package base; impo ...
- shallow copy & deep copy
1.深复制与浅复制的概念 ->浅复制(shallow copy)概念 在SDK Guides中(搜索copy),官方给出的浅复制概念为: Copying compound objects, ...
- JavaScript 深拷贝(deep copy)和浅拷贝(shallow copy)
参考: [进阶4-1期]详细解析赋值.浅拷贝和深拷贝的区别 How to differentiate between deep and shallow copies in JavaScript 在编程 ...
随机推荐
- RSA签名验签学习笔记
RSA私钥签名时要基于某个HASH算法,比如MD5或者SHA1等.之前我一直认为签名的过程是:先对明文做HASH计算,然后用私钥直接对HASH值加密.最近才发现不是那么简单,需要对HASH后的数据进行 ...
- PRML读书会第十一章 Sampling Methods(MCMC, Markov Chain Monte Carlo,细致平稳条件,Metropolis-Hastings,Gibbs Sampling,Slice Sampling,Hamiltonian MCMC)
主讲人 网络上的尼采 (新浪微博: @Nietzsche_复杂网络机器学习) 网络上的尼采(813394698) 9:05:00 今天的主要内容:Markov Chain Monte Carlo,M ...
- SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.0
最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微 ...
- 关于.Net的面试遐想
概述 这几天更新相关的面试题目,主是要针对有4年或以上经验的面试者,总体来说,发现面试人员的答题效果和预期相差比较大,我也在想是不是我出的题目偏离现实,但我更愿意相信,是我们一些.Net开发者在工作中 ...
- 在线程中调用SaveFileDialog
在多线程编程中,有时候可能需要在单独线程中执行某些操作.例如,调用SaveFileDialog类保存文件.首先,我们在Main方法中创建了一个新线程,并将其指向要执行的委托SaveFileAsyn.在 ...
- SQLite常用点滴总结(转)
expressionexpr ::= expr binary-op expr |expr [NOT] like-op expr [ESCAPE expr] |unary-op expr |( ...
- 通过android 客户端上传图片到服务器
昨天,(在我的上一篇博客中)写了通过浏览器上传图片到服务器(php),今天将这个功能付诸实践.(还完善了服务端的代码) 不试不知道,原来通过android 向服务端发送图片还真是挺麻烦的一件事. 上传 ...
- python基础-内置函数详解
一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highlight=built#ascii ...
- Hibernate注解映射联合主键的三种主要方式
今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException ...
- Linux下解决用户不能执行sudo的方法
报错: xxx is not in the sudoers file. This incident will be reported. Linux默认没有为当前用户开启sudo权限! $ su $ ...