模块解读:

浅复制: 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. django 分页django-pure-pagination

    虽然django自带了一个paginator,但不是很方便,我们使用django-pure-pagination github地址https://github.com/jamespacileo/dja ...

  2. 2017.4.7 java异常处理总结

    目录 1.java异常处理的几种错误做法 2.异常处理示例 3.常用异常 4.异常类的继承关系 5.异常处理机制 6.Throw和Throws的区别 7.e.toString(), e.getCaus ...

  3. ElasticSearch Java Api-删除索引

    删除可以是删除整个索引库,也可以根据文档id删除索引库下的文档,还可以通过query查询条件删除所有符合条件的数据. 一.删除整个索引库 下面的例子会删除indexName索引: DeleteInde ...

  4. block传值以及利用block封装一个网络请求类

    1.block在俩个UIViewController间传值 近期刚学了几招block 的高级使用方法,事实上就是利用block语法在俩个UIViewController之间传值,在这里分享给刚開始学习 ...

  5. Angular 学习笔记——ng-Resource1

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  6. 自动播放——幻灯片缓冲效果&&带Loading效果的图片切换&&移动效果(按轨迹移动)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. vscode - 选中多行操作

    选中Alt+鼠标左键即可,按ESC退出 ,具体演示效果如下

  8. Gizmos 辅助线框

    Gizmos are used to give visual debugging or setup aids in the scene view. Gizmos是用于在场景视图可视化调试或辅助设置. ...

  9. 王立平--scard0与scard1分别指的是什么?以及路径获取

    一般是: scard0:指系统内部存储 scard1:指外插的sd卡 也有特例.. 分别获取路径的方法: package com.main; import java.lang.reflect.Meth ...

  10. 自定义ListView和GridView

    1 http://blog.chengyunfeng.com/?p=465 2