需求,当有一个实例a,我们需要一个新的实例b,b同a拥有相同的属性。

当我们使用a=b的模式的时候是一个赋值的过程。a和b指向同一个实例。b的任何操作都同a一样。

在这个使用需要使用copy模块。根据a copy出一个一模一样的b。

class shelf(object):
def __init__(self):
self.books = [] def addbook(self, bookname):
self.books.append(bookname) def delbook(self, bookname):
self.books.remove(bookname) def showbook(self):
for book in self.books:
print book shelf1 = shelf()
shelf1.addbook("the great gatsby")
shelf1.addbook("the little prince")
shelf1.showbook()
print str(id(shelf1))
print "------------0--------------"
import copy
shelf2 = copy.copy(shelf1)
shelf2.showbook()
print str(id(shelf2))
print "------------1---------------"

结果:

the great gatsby
the little prince
31398768
------------0--------------
the great gatsby
the little prince
40185472
------------1---------------

可以看出shelf1和shelf2是两个实例,但是有着相同的属性。

但是有一个问题:

shelf2.delbook("the little prince")
shelf2.showbook()
print "-------------2--------------"
shelf1.showbook()

结果呢?

the great gatsby
-------------2--------------
the great gatsby

  这说明虽然shelf1和shelf2不同的类,但是内容仍然指向相同的地点。

如何解决这个问题:

copy.deepcopy

看代码:

shelf3 = copy.deepcopy(shelf1)
print "------------3---------------"
shelf3.showbook()
shelf3.addbook("The Wonderful Wizard of Oz")
print "-------------4--------------"
shelf3.showbook()
print "--------------5-------------"
shelf1.showbook()

  结果:

the great gatsby
-------------4--------------
the great gatsby
The Wonderful Wizard of Oz
--------------5-------------
the great gatsby

  这样就解决了内容指向相同的问题。

所以copy模块中copy函数和deepcopy函数的区别就是当类内部有list,dict时候,copy产生的实例有着指向相同内容,deepcopy则将list/dict也创建一个备份。

完整代码:

# -*- coding: utf-8 -*-

class shelf(object):
def __init__(self):
self.books = [] def addbook(self, bookname):
self.books.append(bookname) def delbook(self, bookname):
self.books.remove(bookname) def showbook(self):
for book in self.books:
print book shelf1 = shelf()
shelf1.addbook("the great gatsby")
shelf1.addbook("the little prince")
shelf1.showbook()
print str(id(shelf1))
print "------------0--------------"
import copy
shelf2 = copy.copy(shelf1)
shelf2.showbook()
print str(id(shelf2))
print "------------1---------------"
shelf2.delbook("the little prince")
shelf2.showbook()
print "-------------2--------------"
shelf1.showbook() shelf3 = copy.deepcopy(shelf1)
print "------------3---------------"
shelf3.showbook()
shelf3.addbook("The Wonderful Wizard of Oz")
print "-------------4--------------"
shelf3.showbook()
print "--------------5-------------"
shelf1.showbook()

  

copy module的更多相关文章

  1. Shallow copy and Deep copy

    Shallow copy and Deep copy 第一部分: 一.来自wikipidia的解释: Shallow copy One method of copying an object is t ...

  2. grunt配置太复杂?使用Qbuild进行文件合并、压缩、格式化等处理

    上次简单介绍了下Qbuild的特点和配置,其实实现一个自动化工具并不复杂,往简单里说,无非就是筛选文件和处理文件.但Qbuild的源码也并不少,还是做了不少工作的. 1. 引入了插件机制.在Qbuil ...

  3. grunt配置太复杂?发布一个前端构建工具,简单高效,自动跳过未更新的文件

    做前端项目,如果没有一个自动化构建工具,手动处理那简直就是坑爹O(∩_∩)O.于是上网了解了下,grunt用的人不少,功能也挺强大.看了一下grunt的配置(包括gulp),感觉稍显复杂.当时项目结构 ...

  4. metasploit-post模块信息

    Name                                             Disclosure Date  Rank    Description ----           ...

  5. Think Python - Chapter 15 - Classes and objects

    15.1 User-defined typesWe have used many of Python’s built-in types; now we are going to define a ne ...

  6. 开源图形库 c语言-图形图像库 集合[转]

    开源图形库 c语言-图形图像库 集合[转] Google三维API O3D O3D 是一个开源的 Web API 用来在浏览器上创建界面丰富的交互式的 3D 应用程序.这是一种基于网页的可控3D标准. ...

  7. Think Python Glossary

    一.The way of the program problem solving: The process of formulating a problem, finding a solution, a ...

  8. Angular源代码学习笔记-原创

    时间:2014年12月15日 14:15:10 /** * @license AngularJS v1.3.0-beta.15 * (c) 2010-2014 Google, Inc. http:// ...

  9. Ansible@一个高效的配置管理工具--Ansible configure management--翻译(八)

    如无书面授权,请勿转载 第四章,大型项目中Ansible的使用 Roles If your playbooks start expanding beyond what includes can hel ...

随机推荐

  1. The Unique MST(次小生成树)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22335   Accepted: 7922 Description Give ...

  2. https://www.nginx.com/blog/introduction-to-microservices/

    https://www.nginx.com/blog/introduction-to-microservices/

  3. #ASP.NET Core 1.0 Key Features

    Cross platform support and flexible runtime engine(跨平台支持和灵活的运行时引擎) ASP.NET Core 1.0 offers support f ...

  4. phpstorm 10 修改背景图片和字体

    修改menu:File ~ Settings ~ Appearance & Behavior ~ Appearance ~ Theme 改成 Darcula即成黑色背景 menu字体大小: 编 ...

  5. 再探CSS 中 class 命名规范

    一直以来我的CSS 的 class命名都是比较随意,有时采用驼峰式.有时采用下划线,好像没有什么统一的标准,想到什么英文单词就拿过来用,这对于自己瞎写的小项目无伤大雅,遇到冲突的问题可稍加调整改变即可 ...

  6. Spoj 10628. Count on a tree 题解

    题目大意: 给定一棵n个点的树,每个点有一个权值,m个询问,每次询问树上点x到点y的路径上的第k小数. 思路: dfs后给每个节点一个dfs序,以每个点在他父亲的基础上建立主席树,询问时用(点x+点y ...

  7. ACM: 限时训练题解-Street Lamps-贪心-字符串【超水】

    Street Lamps   Bahosain is walking in a street of N blocks. Each block is either empty or has one la ...

  8. 转:jQuery插件开发精品教程,让你的jQuery提升一个台阶

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  9. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  10. Linux 下安装mysql 链接库

    1.mysql 客户端 开发 链接库 1.1)CentOS yum install mysql-devel