copy module
需求,当有一个实例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的更多相关文章
- Shallow copy and Deep copy
Shallow copy and Deep copy 第一部分: 一.来自wikipidia的解释: Shallow copy One method of copying an object is t ...
- grunt配置太复杂?使用Qbuild进行文件合并、压缩、格式化等处理
上次简单介绍了下Qbuild的特点和配置,其实实现一个自动化工具并不复杂,往简单里说,无非就是筛选文件和处理文件.但Qbuild的源码也并不少,还是做了不少工作的. 1. 引入了插件机制.在Qbuil ...
- grunt配置太复杂?发布一个前端构建工具,简单高效,自动跳过未更新的文件
做前端项目,如果没有一个自动化构建工具,手动处理那简直就是坑爹O(∩_∩)O.于是上网了解了下,grunt用的人不少,功能也挺强大.看了一下grunt的配置(包括gulp),感觉稍显复杂.当时项目结构 ...
- metasploit-post模块信息
Name Disclosure Date Rank Description ---- ...
- 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 ...
- 开源图形库 c语言-图形图像库 集合[转]
开源图形库 c语言-图形图像库 集合[转] Google三维API O3D O3D 是一个开源的 Web API 用来在浏览器上创建界面丰富的交互式的 3D 应用程序.这是一种基于网页的可控3D标准. ...
- Think Python Glossary
一.The way of the program problem solving: The process of formulating a problem, finding a solution, a ...
- Angular源代码学习笔记-原创
时间:2014年12月15日 14:15:10 /** * @license AngularJS v1.3.0-beta.15 * (c) 2010-2014 Google, Inc. http:// ...
- Ansible@一个高效的配置管理工具--Ansible configure management--翻译(八)
如无书面授权,请勿转载 第四章,大型项目中Ansible的使用 Roles If your playbooks start expanding beyond what includes can hel ...
随机推荐
- FastMM 定位内存泄露的代码位置
FastMM 定位内存泄露的代码位置 开源的FastMM,使用很简单,在工程的第一行引用FastMM4即可(注意,一定要在第一个Uses的位置),可以在调试程序时提示内存泄露情况,还可以生成报告. 在 ...
- c#静态构造函数
作用是初始化一些类的静态成员 1.在实例化类的对象,或者引用任何的静态成员之前,.Net自动调用此构造函数,而且只调用一次 2.没有任何修饰符,也没有参数 3.一个类只能有一个静态构造函数 4.无参的 ...
- c# 修饰词public, protected, private,internal,protected的区别
public: 对任何类和成员都公开, 无限制访问;protected: 仅仅对该类以及该类的派生类公开;private: 仅仅对该类公开;internal: 只能值包含该类的程序集中访问该类(只是 ...
- HD1394 Minimum Inversion Number
这道题目的意思是:给你一个序列,统计一开始的逆序数的个数,然后依次把第一个元素放到序列末尾,求每次的逆序数个数,求出每次求逆序数里,逆序数最小的那个数 这里需要推一个递推式,就是每次你把第一个元素放到 ...
- BZOJ4117 : [Wf2015]Weather Report
一种天气情况的概率只与4种天气的出现次数有关,故将相同概率的情况计数后放入堆中模拟哈夫曼树即可. 每次取出概率最小的,将它个数除以2,对于零头需要特判. #include<cstdio> ...
- topcoder SRM 625 DIV2 AddMultiply
由于题目告诉肯定至少存在一种解, 故只需要根据条件遍历一下, vector <int> makeExpression(int y) { vector<int> res; ; i ...
- lua语法备忘录
1.三元表达式 a?b:c => a and b or c 2.循环数组 local keys = args.kvs:get_keys() local arr = xstring.split(k ...
- Visio 2007/2010 左侧"形状"窗口管理
Visio 2007/2010 左侧"形状"窗口管理 Visio 打开后,通常窗口左侧会有一个“形状”面板,我们可以方便地从中选择需要的形状.有时为了获得更大的版面空间或者不小心关 ...
- 接口测试之soupui&groovy
原著地址:http://www.cnblogs.com/wade-xu/p/4236295.html#3334654 需注意下方code的设置
- RestTemplate实践
什么是RestTemplate? RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效 ...