博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python deep copy and shallow copy
阅读量:6269 次
发布时间:2019-06-22

本文共 2734 字,大约阅读时间需要 9 分钟。

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]: bOut[31]: [1, 2, [3, 4]]In [32]: cOut[32]: [1, 2, [3, 4]]In [33]: dOut[33]: [1, 2, [3, 4]]In [34]: a.append(5)In [35]: aOut[35]: [1, 2, [3, 4], 5]In [36]: bOut[36]: [1, 2, [3, 4], 5]In [37]: cOut[37]: [1, 2, [3, 4]]In [38]: dOut[38]: [1, 2, [3, 4]]In [39]: a[2].append(6)In [40]: aOut[40]: [1, 2, [3, 4, 6], 5]In [41]: bOut[41]: [1, 2, [3, 4, 6], 5]In [42]: cOut[42]: [1, 2, [3, 4, 6]]In [43]: dOut[43]: [1, 2, [3, 4]]

 

一些对象的浅拷贝可以通过其他方式实现,如字典可以使用 dict.copy(),列表使用listb = lista[:],如下:

In [46]: a = {'name': 'wang',}In [47]: b = dict.copy(a)In [48]: bOut[48]: {'name': 'wang'}In [49]: a.update({'age': 13})In [50]: aOut[50]: {'age': 13, 'name': 'wang'}In [51]: bOut[51]: {'name': 'wang'}In [52]: a = {'name': {'first_name': 'wang'}}                                                                                                                                                     In [53]: b = dict.copy(a)In [54]: bOut[54]: {'name': {'first_name': 'wang'}}In [55]: a['name'].update({'last_name': 'Emma'})                                                                                                                                                  In [56]: aOut[56]: {'name': {'first_name': 'wang', 'last_name': 'Emma'}}In [57]: bOut[57]: {'name': {'first_name': 'wang', 'last_name': 'Emma'}}In [58]: lista = [1, 2]In [59]: listb = lista[:]In [60]: lista.append(3)In [61]: listaOut[61]: [1, 2, 3]In [62]: listbOut[62]: [1, 2]In [63]: lista = [1, 2, [3, 4]]In [64]: listb = lista[:]In [65]: lista[2].append(5)In [66]: listbOut[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  

你可能感兴趣的文章
(zhuan) 自然语言处理中的Attention Model:是什么及为什么
查看>>
C#中使用RabbitMQ收发队列消息
查看>>
Hadoop1.2.1 全然分布式集群搭建实操笔记
查看>>
第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...
查看>>
MVC总结--MVC简单介绍以及和WebForm差别
查看>>
tiny4412 裸机程序 五、控制icache【转】
查看>>
VB.NET多线程入门
查看>>
国外物联网平台初探(二) ——微软Azure IoT
查看>>
findlibrary returned null产生的联想,Android ndk开发打包时我们应该怎样注意平台的兼容(x86,arm,arm-v7a)...
查看>>
Android事件分发机制源代码分析
查看>>
《设计模式》结构型模式
查看>>
[javase学习笔记]-8.3 statickeyword使用的注意细节
查看>>
Spring集成RabbitMQ-使用RabbitMQ更方便
查看>>
Nginx 设置域名转向配置
查看>>
.net core 实现简单爬虫—抓取博客园的博文列表
查看>>
FP-Tree算法的实现
查看>>
Android 用Handler和Message实现计时效果及其中一些疑问
查看>>
Dos命令删除添加新服务
查看>>
C#.NET常见问题(FAQ)-索引器indexer有什么用
查看>>
hadoop YARN配置参数剖析—MapReduce相关参数
查看>>