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 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。

  1.  
  1. import copy
    # a = 123
    # b = 123
    # c = a
    # print(id(a))
    # print(id(b))
    # print(id(c))
    # 1345408560
    # 1345408560
    # 1345408560
  2.  
  3. # a1 = copy.copy(a)
    # a2 = copy.deepcopy(a)
    # print(id(a1))
    # print(id(a2))
    # 1345408560
    # 1345408560
  4.  
  5. # 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
  6.  
  7. # 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
  8.  
  9. dic = {
    'cpu':[80,],
    'mem':[80,],
    'hdd':[80,],
    }
  10.  
  11. 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)
  12.  
  13. # 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]}
  14.  
  15. # 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]}
  1.  

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. 《个人-GIT使用方法》

    使用GIT版本控制工具及基本使用方法(安装,新建,推送,拉取),托管平台的使用方法. Git 常用命令 git init here -- 创建本地仓库(repository),将会在文件夹下创建一个 ...

  2. awk知识点全回顾

    本文目录:1.awk简介和基本语法格式2.print和printf格式化输出3.输入行的字段分隔符和行分隔符4.BGEIN和END5.数组6.流程控制语句 6.1 条件判断语句 6.2 while循环 ...

  3. Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

    注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...

  4. PHP初入,基础知识点整理(样式表&选择器的使用整理)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. !JS实战之随机像素图

    JavaScript实例分享之----画随机像素图.随机像素图(作者自己取得名字)指的是一张图片上每一个像素的颜色都是随机的.此时应该能联想到这幅图多么眼花缭乱,好吧,我们用JS来实现它的原因是JS很 ...

  6. 201521123099 《Java程序设计》第3周学习总结

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

  7. java课程设计 猜数游戏 个人

    1.团队课程设计博客链接 /http://www.cnblogs.com/ohanna/p/7064305.html 2.个人负责模块说明 1.进入界面: 2.成功玩家信息的录入: 3.信息的读出 3 ...

  8. Java第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  9. mariadb自带命令行客户端指令笔记

    mysql -H 主机IP -u 用户名 -p -p表示要输密码,不要直接输了,要回车后在程序里输入 显示数据库列表: show databases; 选择XX数据库: use XX; 显示数据库里的 ...

  10. 【京东详情页】——原生js学习之匿名函数

    一.引言 在js模块中,要给每一个功能封装一个匿名函数.为了更好的理解什么是匿名函数,为什么要用匿名函数,我做了一些查阅和学习. 二.匿名函数 什么是:在创建时,不被任何变量引用的函数. 为什么:节约 ...