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()

  

原文地址:https://www.cnblogs.com/felixwa/p/5853537.html