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的更多相关文章

  1. [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. 这道题问 ...

  2. 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 ...

  3. deep copy and shallow copy

    链接A:浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当值拷贝的时候,两个对象就有用共同的资源,同时对资 ...

  4. python中的shallow copy 与 deep copy

    今天在写代码的时候遇到一个奇葩的问题,问题描述如下: 代码中声明了一个list,将list作为参数传入了function1()中,在function1()中对list进行了del()即删除了一个元素. ...

  5. 由Python的浅拷贝(shallow copy)和深拷贝(deep copy)引发的思考

    首先查看拷贝模块(copy)发现: >>> help(copy)Help on module copy:NAME    copy - Generic (shallow and dee ...

  6. Shallow copy and Deep copy

    Shallow copy and Deep copy 第一部分: 一.来自wikipidia的解释: Shallow copy One method of copying an object is t ...

  7. shallow copy 和 deep copy 的示例

    本文属原创,转载请注明出处:http://www.cnblogs.com/robinjava77/p/5481874.html   (Robin) Student package base; impo ...

  8. shallow copy & deep copy

    1.深复制与浅复制的概念 ->浅复制(shallow copy)概念   在SDK Guides中(搜索copy),官方给出的浅复制概念为: Copying compound objects, ...

  9. JavaScript 深拷贝(deep copy)和浅拷贝(shallow copy)

    参考: [进阶4-1期]详细解析赋值.浅拷贝和深拷贝的区别 How to differentiate between deep and shallow copies in JavaScript 在编程 ...

随机推荐

  1. 本地的html怎么直接通过路径就读取本地文件。

    我要做的事情是已知一个目录的相对路径,获得这个路径下面所有的txt文件,然后读到一个JS Script里面做下一步处理. 网上的例子都是使用input的,既然我是local的html文件,也知道路径了 ...

  2. 阿里云Ubuntu 14.04 + Nginx + let's encrypt 搭建https访问

    参考页面: https://certbot.eff.org/#ubuntutrusty-nginx http://bbs.qcloud.com/thread-12059-1-1.html http:/ ...

  3. centos7 安装nginx和php5.6.25遇到 无法访问php页面 报错file not found 问题解决

    php-fpm安装完成,nginx安装完成 netstap -ntl| 发下端口正常开启 iptables -L 返现9000端口已经开放 ps -aux|grep nginx 发下nginx进程正常 ...

  4. 深入学习JavaScript(二)

    函数表达式和函数声明 函数声明 function 函数名(参数){函数体} 函数表达式 function 函数名(可选)(参数){函数体} 示例: function foo(){} // 声明,因为它 ...

  5. MyBatis学习--mybatis开发dao的方法

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...

  6. zabbix监控网络的出入口流量

    首先我们登录到zabbix 点击配置---->模板-->Template OS Linux 下的监控项 点击右上角的添加监控项目 我们的服务器是在Ucloud上的,我们的网卡名称为eth0 ...

  7. [转]html js中name和id的区别和使用分析

    js中web页面元素的调用可以有两种识别方法:id和name 自己在用的过程中总结一下id和name的使用区别. 一,使用范围 除 BASE, HEAD, HTML, META, SCRIPT, ST ...

  8. 【POJ 1113】Wall

    http://poj.org/problem?id=1113 夏令营讲课时的求凸包例题,据说是PKUSC2015的一道题 我WA两次错在四舍五入上了(=゚ω゚)ノ #include<cmath& ...

  9. JDK历史版本下载

    JDK6: http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409. ...

  10. python日常-list and dict

    什么是list: list 觉得算是python日常编程中用的最多的python自带的数据结构了.但是python重的list跟其他语言中的并不相同. 少年..不知道你听说过python中的appen ...