笔记-python-standard library-8.10 copy

1.      copy

source code:Lib/copy.py

python中的赋值语句不复制对象,它创建了对象和目标之间的指向/绑定。

对于可变对象来说,有时需要一个复制体,而非引用,本模块提供了shallow copy和deep copy操作。

接口函数:

copy.copy(x) 返回一个shallow copy

copy.deepcopy(x) 返回一个deep copy

exception copy.error 抛出模块特定错误

浅复制和深复制的区别:

  1. 两者之间的区别主要是针对复杂对象而言的,例如列表和类实例。
  2. 浅复制复制对象但不复制引用体。
  3. 深复制复制对象,同时递归的去寻找它在原始对象的内容并复制。

深复制通常会存在两个问题,而浅复制不会:

  1. 递归对象可能会导致递归循环;
  2. 深复制可能会复制太多不必要的内容,比如应该在两个对象之间共享的内容。

针对上述问题,深拷贝通过以下方式避免:

  1. 保留一个“memo”字典用于描述拷贝的对象。
  2. 让用户定义的类覆盖掉复制操作或复制过来的组件。

1.1.1.   example

import copy

la = [1, 2, 3, ['a', 'b', 'c']]

lb = la

print(id(lb) == id(la)) #True

# copy

lb = copy.copy(la)

print(id(lb) == id(la)) #False

print(id(lb[3]) == id(la[3])) #True

# deep copy

lb = copy.deepcopy(la)

print(id(lb) == id(la)) #False

print(id(lb[3]) == id(la[3])) #False

解释:

python中变量全是对象/引用,因此变量都是指向的内存区域的一个引用,判断变量指向的内存区域是否相同可以判断是否同一对象。

浅拷贝时la和lb的指向不同了,但内部的引用la[3]和lb[3]的指向仍是相同的。可见只复制了引用a[3]而没有复制引用指向的对象。

在深拷贝中a[3]和b[3]指向的内存是不一样的,可见复制了引用对象。

使用la[3] is lb[3]效果应该是一样的。

最新文章

  1. C#夯实基础之多线程三:线程的优先级
  2. 【Win 10 应用开发】Toast通知激活应用——前台&后台
  3. SpringHttpInvoker解析2-服务端实现
  4. jQuery属性,方法操作
  5. 百度编辑器ueditor获取不到内容?请把form放在table等其他元素最外面
  6. 怎么安装phpcms?PHPCMS V9安装图文教程
  7. codevs 1222 信与信封问题(二分图的完美匹配)
  8. 第三篇:R语言数据可视化之条形图
  9. 编译lua5.3.2报错提示libreadline.so存在未定义的引用解决方法
  10. Server Tomcat v7.0 Server at localhost failed to start.解决方法
  11. Elasticsearch分片、副本与路由(shard replica routing)
  12. CSS3 动画 animation和@keyframes
  13. hibernate之实体@onetomany和@manytoone双向注解(转)
  14. 物联网框架ServerSuperIO.Core(.netcore)跨平台,一套设备驱动通吃嵌入式、上位机、云服务
  15. Android/Linux Thermal框架分析及其Governor对比
  16. 取消Fragment切换时间,Fragment+ViewPager静止滑动,去掉默认的滑动效果
  17. html5 javascript 新增加的高级选择器更精准更实用
  18. ajax,分页器
  19. CentOS7 搭建LVS+keepalived负载均衡
  20. jQuery版本问题,及事件源

热门文章

  1. SpringMVC核心技术---转发和重定向
  2. C#启动或停止 计算机中“服务”
  3. (转载)C#中的lock关键字
  4. 《Python高效开发实战》实战演练——建立应用2
  5. 【extjs6学习笔记】1.9 初始: Mixins
  6. System Center Configuration Manager 2016 域准备篇(Part4)
  7. LeetCode Length of Last Word 最后一个字的长度
  8. GridView的 PreRender事件与范例--GridView + CheckBox,点选多列资料(复选删除)
  9. JS获取本地文件并且解析文件内容(XML,TXT)
  10. Selenium关闭windows系统弹窗