zoukankan      html  css  js  c++  java
  • 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()
    

      

  • 相关阅读:
    android工程混淆和反编译
    php+列出目录文件
    php+大文件管理
    支持粘贴图片的富文本编辑器
    web上传整个文件夹
    文件夹管理
    断点续传
    超大文件上传方案
    ueditor+word粘贴上传
    java+大文件上传
  • 原文地址:https://www.cnblogs.com/felixwa/p/5853537.html
Copyright © 2011-2022 走看看