模块解读:

浅复制: 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. python+ubuntu+selenium安装chrome和chromedriver

    请确保selenium已经安装成功,没安装的可以pip install selenium 安装chrome 在终端输入 下载安装包 wget https://dl.google.com/linux/d ...

  2. 在pos:a元素不设定宽度的情况下,他的最大宽度是受父元素的宽度所限制的。

    <div style="width:80px;height:50px;position:relative;left:50px;"> <ul style=" ...

  3. x-pack破解并安装

    声明:本文仅作为学习交流,请勿用于商业用途,否则后果自负.如需使用黄金或白金版X-Pack请购买正版. 1. 安装x-pack 具体安装过程参照:http://www.cnblogs.com/shao ...

  4. 【转】Linux 中清空或删除大文件内容的五种方法(truncate 命令清空文件)

    原文: http://www.jb51.net/article/100462.htm truncate -s 0 access.log -------------------------------- ...

  5. Vector的一种实现(二)

      增加了逆置迭代器的实现 以及swap功能   完整代码如下: #ifndef VECTOR_H_ #define VECTOR_H_ #include <stddef.h> #incl ...

  6. 替代 Navigator 组件

    前言:最近在研究 react-native 时,突然发现 Navigator 组件被 react-native 包 抛弃了.现总结了几种替代方法. 方法一:引入 react-native-deprec ...

  7. chown将指定文件的拥有者改为指定的用户或组(转)

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  8. TortoiseGit 连接oschina不用每次输入username和password的方法

    每次git clone 和push 都要输入username和password.尽管安全.但在本机上每次都输有些麻烦,怎样记住username和password呢? 在网上看了各种方法,太杂,非常多可 ...

  9. 娓娓道来c指针 (2)内存分配

    (2)内存分配 c语言中描写叙述变量的时候经常使用的两个用语 1.作用域:也叫可见域,指的是变量的作用范围. 在哪个范围内.该变量是可见的.能够使用的. 2.生存期:也叫存储期.指的是变量从创建到销毁 ...

  10. 如何为Apache JMeter开发插件(一)

    本文转载于http://blog.csdn.net/column/details/12925.html,作者:xreztento 作者写的很精华,我打算在此系列操作一遍后,加多点截图,便于更多人更快上 ...