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. C#:委托(delegate)和事件(event) (转)

    委托(delegate): 它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现.下面来看看它的实现步骤: 声明一个delegate对象. 实现和delegate具有相同 ...

  2. 一步步带你做vue后台管理框架(二)——上手使用

    系列教程<一步步带你做vue后台管理框架>第二课 github地址:vue-framework-wz 线上体验地址:立即体验 闲扯再多不会用也没白搭,这节课我来带大家直接上手框架,体验到简 ...

  3. EF增删改查+使用Expression进行动态排序分页

    注:以下部分来自<ASP.NET MVC 企业级实战>一书的摘抄和改写以及部分个人学习心得. EF简单增删改查 增加 public static int Add() { using (No ...

  4. test文件伪装

    该文件属于伪装图片类型.图片另存后把后缀改为rar将看到txt文件. 利用了 cmd cp  /b  命令 命令格式:copy /b 文件1+文件2+......文件N 合并后的文件名<br&g ...

  5. JS学习三(函数)

    [函数的声明格式] 1.函数的声明格式: function 函数名(参数1,参数2,...){ 函数体代码 return 返回值: } 函数的调用: ① 直接调用:函数名(参数1的值,参数2的值,.. ...

  6. java 反射详解

    反射的概念和原理 类字节码文件是在硬盘上存储的,是一个个的.class文件.我们在new一个对象时,JVM会先把字节码文件的信息读出来放到内存中,第二次用时,就不用在加载了,而是直接使用之前缓存的这个 ...

  7. JS中的运算符和JS中的分支结构

    JS中的运算符 1.算术运算(单目运算符) + .-.*. /. %取余.++自增 .--自减 +:两种作用,链接字符串/加法运算.当+两边全为数字时,进行加法运算:当+两边有任意一边为字符串时,起链 ...

  8. 201521123102 《Java程序设计》第1周学习总结

    #1. 本周学习总结(1)初步了解java程序的运行环境,通过命令行语句编译简单的java程序(2)使用notepad编写,cmd下进入文件夹编译程序(3)学习使用各种快捷键补全代码(4)能够区别jd ...

  9. Java:java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  10. POJ--3258 River Hopscotch (最小值最大化C++)

    River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15273   Accepted: 6465 ...