python deep copy and shallow copy

时间:2022-09-09 16:57:56

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. Python 基礎 - 字典的操作使用

    接下來介紹字典,這在未來工作上,會是很常使用的,就來好好了解一下唄- 字典是一個 key(鍵)-value(值) 的數據類型,可以儲存很多訊息 #!/usr/bin/env python3 # -*- ...

  2. HDU HDU1558 Segment set(并查集+判断线段相交)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558 解题报告:首先如果两条线段有交点的话,这两条线段在一个集合内,如果a跟b在一个集合内,b跟c在一 ...

  3. MQTT协议(一)

    MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...

  4. swprintf %s %ws %S 的区别

    http://www.codeproject.com/Articles/20869/D-Fast-Wavelet-Transform-Library-for-Image-Proces该作者提供的源代码 ...

  5. SOCKET:SO_LINGER 选项

    好多次接触到SO_LINGER选项,但总是忘了这是干什么用的.现在整理一下,我才明白这个参数是用来设定“SOCKET在CLOSE时候是否等待缓冲区发送完成”这个特性的.下面是一些详细的说明. sets ...

  6. Js异步级联选择框实践方法

    HTML: <li> <span>所在地区:</span> <select name="prov" id="ddl_prov&q ...

  7. 解读Laravel,看PHP如何实现Facade?

    刚刚开始学Laravel就会接触到路由 Route::get('/', function () { return view('welcome'); }); 后来笔者一本正经的去读过Route类的代码, ...

  8. SpringBoot使用WebJars

    本人主要做的是java,但是从第一份工作开始,就一直在做一个写前端又写后端的程序员,相信很多朋友和我一样,不仅要会后台代码,还要懂得很多的前端代码,例如javascipt和css样式. 本文就为大家简 ...

  9. cmd 命令

    cmd 在桌面或任意磁盘新建一个TXT--输入CMD并保存--修改扩展名为.BAT md 文件夹名 新建文件夹cd 文件夹名 进入到该目录cd.. 返回上一层目录cd\ 返回根目录cd.>文件名 ...

  10. web开发必备的浏览器常识

    浏览器内核: 1.使用Trident内核的浏览器:IE.Maxthon.TT.The World等: 2.使用Gecko内核的浏览器:Netcape6及以上版本.FireFox.MozillaSuit ...