copy和deepcopy有什么区别?

http://blog.csdn.net/qq_32907349/article/details/52190796

http://iaman.actor/blog/2016/04/17/copy-in-python

我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
而浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。

对于简单的 object,用 shallow copy 和 deep copy 没区别

复杂的 object, 如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。


import copy
# a = 123
# b = 123
# c = a
# print(id(a))
# print(id(b))
# print(id(c))
# 1345408560
# 1345408560
# 1345408560 # a1 = copy.copy(a)
# a2 = copy.deepcopy(a)
# print(id(a1))
# print(id(a2))
# 1345408560
# 1345408560 # n1 = {'k1':123,'k2':'abc','k3':[1,'bv']}
# # n2 = n1
# n2 = copy.copy(n1)
# # n2 = copy.deepcopy(n1)
# print(id(n1))
# print(id(n2))
# n2['k3'][0] = 3
# print(n2)
# print(n1)
# print(id(n1))
# print(id(n2))
# 16596928
# 16642096
# {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
# {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
# 16596928
# 16642096 # n1 = {'k1':123,'k2':'abc','k3':[1,'bv']}
# n2 = n1
# n2 = copy.copy(n1)
# n2 = copy.deepcopy(n1)
# print(id(n1))
# print(id(n2))
# n2['k3'][0] = 3
# print(n2)
# print(n1)
# print(id(n1))
# print(id(n2))
# print(id(n1['k3']))
# print(id(n2['k3']))
# 51986368
# 53434384
# {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
# {'k1': 123, 'k2': 'abc', 'k3': [1, 'bv']}
# 51986368
# 53434384
# 53427456
# 53427496 dic = {
'cpu':[80,],
'mem':[80,],
'hdd':[80,],
} new_dic = copy.deepcopy(dic)
print(dic)
print(new_dic)
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
print("*"*60)
new_dic['cpu'][0] = 70
print(dic)
print(new_dic) # new_dic = copy.copy(dic)
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# ************************************************************
# {'cpu': [70], 'mem': [80], 'hdd': [80]}
# {'cpu': [70], 'mem': [80], 'hdd': [80]} # new_dic = copy.deepcopy(dic)
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# ************************************************************
# {'cpu': [80], 'mem': [80], 'hdd': [80]}
# {'cpu': [70], 'mem': [80], 'hdd': [80]}
 

Python面试题之copy/deepcopy详解的更多相关文章

  1. **Python中的深拷贝和浅拷贝详解

    Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

  2. python中的subprocess.Popen()使用详解---以及注意的问题(死锁)

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

  3. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

  4. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  5. python 3.x 爬虫基础---Urllib详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...

  6. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  7. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...

  8. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  9. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

随机推荐

  1. bugly cocos 接入和 符号表使用

    bugly cocos 接入和 符号表使用 在bugly网站下载 BuglyCocosPlugin 的sdk ios 1. 在 项目的 classes 里面新建 文件夹  BuglyCocosPlug ...

  2. Zookeeper和 Google Chubby对比分析

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt375 随着云计算的推广,云平台的设计和实现越来越复杂,很多系统属性如一致性和 ...

  3. 团队作业10——beta阶段项目复审

    小组的名字和链接 优点 缺点(bug报告) 最终名次 拖鞋大队 基本功能都实现了,符合用户的需求:每次都能按时完成博客,满足题目要求,所以作业完成的也比较优秀.较alpha版本新增了查重自定义的功能, ...

  4. 团队作业8——第二次项目冲刺(Beta阶段)(冲刺计划)

    Beta阶段冲刺计划 Alpha冲刺暂时告一段落,项目现在也有个了大体框架,当然还是有很多漏洞,在接下来的Beta冲刺中尽量完善,希望最后能有一个好的结果. 新成员介绍 何跃斌:掌握java.c的基本 ...

  5. 201521123106《java程序设计》第三周学习总结

    1. 本周学习总结 2. 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pub ...

  6. 201521123004 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 注意: notify()/notifyAll()方法和wait()方法都只能在被声明为synchronized的方 ...

  7. 201521123019 《Java程序设计》第10周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只有执 ...

  8. Spring详解(六)------AOP 注解

    上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 ...

  9. Java :内部类基础详解

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { pr ...

  10. Python爬虫总结

    Python爬虫的原理:1通过URLopen()来获取到url页面, 这个过程可以加代理 2这个页面上都是字符串,所以我们而通过字符串查找的方法来获取到目标字符串,用到了正则来匹配目标re.finda ...