模块解读:

浅复制: x = copy.copy(y)
深复制: x = copy.deepcopy(y)
(注:模块特有的异常,copy.Error)

深copy与浅copy的差别主要体现在当有混合对象时,即在一个对象中包含其他子对象,比如在一个字典中的一个value是一个列表,这时:
浅copy,没有拷贝子对象,所以原始数据改变,子对象会跟着改变。
深copy,包含拷贝对象中对子对象的拷贝,也就是说原始数据改变,子对象不会随之改变。

举个例子:
info = {
'name':'webber',
'job':'IT',
'age':24,
'girlfriend':['a','b','c']
}

new_info = copy.copy(info)        #浅copy
new_info['sex'] = 'male'

print 'info: ',info
print 'new_info',new_info

输出:
info: {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber'}
new_info {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'sex': 'male', 'job': 'IT', 'name': 'webber'}

-------------------------------------------------------------------------------------------

new_info = copy.copy(info)        #浅copy
new_info['girlfriend'].append('dddd')

输出:
info: {'girlfriend': ['a', 'b', 'c', 'dddd'], 'age': 24, 'job': 'IT', 'name': 'webber'}
new_info {'girlfriend': ['a', 'b', 'c', 'dddd'], 'age': 24, 'job': 'IT', 'name': 'webber'}

-------------------------------------------------------------------------------------------

new_info = copy.deepcopy(info)      #深copy
new_info['sex'] = 'male'

输出:
info: {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber'}
new_info {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'sex': 'male', 'job': 'IT', 'name': 'webber'}

-------------------------------------------------------------------------------------------

new_info = copy.deepcopy(info)      #深copy
new_info['girlfriend'].append('dddd')

输出:
info: {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber'}
new_info {'girlfriend': ['a', 'b', 'c', 'dddd'], 'age': 24, 'job': 'IT', 'name': 'webber'}

--------------------------------------------------------------------------------------------

这里发现,当往字典中添加sex信息时,无论深copy还是浅copy都互不影响,但是在往字典的子对象列表中添加信息时有了区别,浅copy把子对象都做出了修改,而深copy却没有,更新new_info信息,info字典中的信息没有发生改变。

这里还要把浅copy与直接赋值做一下区分:
直接赋值,就是传递对象的引用,即原始数据改变,新的赋值对象数据也会随之改变,

沿用上面的例子:
new_info = info
new_info['sex'] = 'male'

输出:
info: {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber', 'sex': 'male'}
new_info {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber', 'sex': 'male'}  #完全相同

无论修改谁,另一个都会改变,因为他们指向同一个内存空间。

另一个详细例子:http://www.cnblogs.com/xueli/p/4952063.html

=============================================================

此外,模块用法中提到两个注意点,在深copy中可能会遇到的问题,而浅copy中不存在:

1、深copy递归的把所有子对象都复制了,这里存在一个递归循环,可能会引起性能资源的不足,使用时应该当心。

2、由于深copy把一个对象的“所有”都给copy了,那么当深copy一个重要的对象时,假如里面含有管理权限的数据结构,这样可能把这些信息共享给了不具有管理权限的对象。

python 深复制与浅复制------copy模块的更多相关文章

  1. Python学习日记之字典深复制与浅复制

    Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...

  2. python 深复制和浅复制

    https://www.python-course.eu/python3_deep_copy.php-------------------------------------------------- ...

  3. 深复制与浅复制&&strong,copy修饰符总结

    又是一个老生常谈的话题,可是貌似这个问题,好多ios开发工程师并不能理解透彻,所以简单记录分析一下深复制与浅复制的原理以及strong,copy修饰符的原理和使用.   一.深复制与浅复制      ...

  4. iOS 集合的深复制与浅复制

    概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...

  5. js中的深复制与浅复制

    前言 所谓深复制与浅复制(深拷贝与浅拷贝),乍一听感觉听高大上,像是一个非常难理解的概念,其实我们平常项目开发都是在用的,只是你可能不知道该怎么叫它的名字而已,就像你听熟了一首歌,就是不知道这首歌叫什 ...

  6. .Net深复制、浅复制

    在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...

  7. C++学习基础七——深复制与浅复制

    一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...

  8. php对象当参数传递 && php深复制和浅复制

    把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象  因为对象是引用传递过去的 class Book { public $name; public function __construct( ...

  9. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  10. Java中的深复制与浅复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

随机推荐

  1. 路由器漏洞复现分析第二弹:CNVD-2018-01084

    1月17日,CNVD公开了D-LinkDIR 615/645/815 service.cgi远程命令执行漏洞(CNVD-2018-01084),freebuf上有前辈写了一篇漏洞复现和poc的文章(h ...

  2. pc_lint的用法转

    PC-Lint是一款C/C++软件代码静态分析工具,不仅可以检查一般的语法错误,还可以检查潜在的错误,比如数组访问越界.内存泄漏.使用未初始化变量.使用空指针等.在单元测试前使用PC-Lint来检查代 ...

  3. python 读取CSV文件 中文乱码

    今天读取一个CSV文件,打印出来,中文显示乱码,原因是编码的缘故,CSV保存是编码格式ANSI,解决办法是以记事本方式打开CSV文件,然后另存为时编码选择UTF-8进行保存即可.

  4. 【转】javascript 的类,原型,继承的理解

    原文: https://www.cnblogs.com/codernie/p/9098184.html ------------------------------------------------ ...

  5. How does a single thread handle asynchronous code in JavaScript?

    原文:https://www.quora.com/How-does-a-single-thread-handle-asynchronous-code-in-JavaScript ----------- ...

  6. [Functional Programming] Combine State Dependent Transactions with the State ADT (composeK to replace multi chian call)

    When developing a Finite State Machine, it is often necessary to apply multiple transitions in tande ...

  7. jsp中URL传递中文參数的处理

    在页面的url中使用encodeURI(encodeURI(中文)).对中文进行编码.并在server的java程序中使用URLDecoder.decode(中文, "UTF-8" ...

  8. ionic中actionsheet在安卓中显示样式问题

    可以看到在浏览器上是正常的,在安卓上的样式没了 建议不要直接去动ionic的css文件,容易影响全局 方法:注释掉_action-sheet.sass中文件123行,针对安卓样式去写的样sass 保存 ...

  9. 最小化JavaScript代码

    1.去除不必要的格式符.空白符.凝视符. 这个操作.事实上能够理解为是一种格式化.尽管它操作的结果事实上是去除掉原始文件的那些格式. 2.模糊(Obfuscation)处理JAVASCRIP脚本源码. ...

  10. JQuery DataTables学习

    1.Datatables简单介绍 DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,根据的基础逐步增强,这将添加先进的互动控制.支持不论什么HTML表格. 主要特点: 自己主动 ...