zoukankan      html  css  js  c++  java
  • python 深复制与浅复制------copy模块

    模块解读:

    浅复制: x = copy.copy(y)
    深复制: x = copy.deepcopy(y)
    (注:模块特有的异常,copy.Error)

    深copy与浅copy的差别主要体现在当有混合对象时,即在一个对象中包含其他子对象,比如在一个字典中的一个value是一个列表,这时:
    浅copy,没有拷贝子对象,所以原始数据改变,子对象会跟着改变。
    深copy,包含拷贝对象中对子对象的拷贝,也就是说原始数据改变,子对象不会随之改变。

    举个例子:
    info = {
    'name':'webber',
    'job':'IT',
    'age':24,
    'girlfriend':['a','b','c']
    }

    new_info = copy.copy(info)        #浅copy
    new_info['sex'] = 'male'

    print 'info: ',info
    print 'new_info',new_info

    输出:
    info: {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber'}
    new_info {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'sex': 'male', 'job': 'IT', 'name': 'webber'}

    -------------------------------------------------------------------------------------------

    new_info = copy.copy(info)        #浅copy
    new_info['girlfriend'].append('dddd')

    输出:
    info: {'girlfriend': ['a', 'b', 'c', 'dddd'], 'age': 24, 'job': 'IT', 'name': 'webber'}
    new_info {'girlfriend': ['a', 'b', 'c', 'dddd'], 'age': 24, 'job': 'IT', 'name': 'webber'}

    -------------------------------------------------------------------------------------------

    new_info = copy.deepcopy(info)      #深copy
    new_info['sex'] = 'male'

    输出:
    info: {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber'}
    new_info {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'sex': 'male', 'job': 'IT', 'name': 'webber'}

    -------------------------------------------------------------------------------------------

    new_info = copy.deepcopy(info)      #深copy
    new_info['girlfriend'].append('dddd')

    输出:
    info: {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber'}
    new_info {'girlfriend': ['a', 'b', 'c', 'dddd'], 'age': 24, 'job': 'IT', 'name': 'webber'}

    --------------------------------------------------------------------------------------------

    这里发现,当往字典中添加sex信息时,无论深copy还是浅copy都互不影响,但是在往字典的子对象列表中添加信息时有了区别,浅copy把子对象都做出了修改,而深copy却没有,更新new_info信息,info字典中的信息没有发生改变。

    这里还要把浅copy与直接赋值做一下区分:
    直接赋值,就是传递对象的引用,即原始数据改变,新的赋值对象数据也会随之改变,

    沿用上面的例子:
    new_info = info
    new_info['sex'] = 'male'

    输出:
    info: {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber', 'sex': 'male'}
    new_info {'girlfriend': ['a', 'b', 'c'], 'age': 24, 'job': 'IT', 'name': 'webber', 'sex': 'male'}  #完全相同

    无论修改谁,另一个都会改变,因为他们指向同一个内存空间。

    另一个详细例子:http://www.cnblogs.com/xueli/p/4952063.html

    =============================================================

    此外,模块用法中提到两个注意点,在深copy中可能会遇到的问题,而浅copy中不存在:

    1、深copy递归的把所有子对象都复制了,这里存在一个递归循环,可能会引起性能资源的不足,使用时应该当心。

    2、由于深copy把一个对象的“所有”都给copy了,那么当深copy一个重要的对象时,假如里面含有管理权限的数据结构,这样可能把这些信息共享给了不具有管理权限的对象。

  • 相关阅读:
    败家MM
    Lucene.Net
    罗氏制药事件
    关于request编码的问题
    昨天做了个站内全文搜索
    有时间研究 ror框架,ProMesh.NET: 开源的.net MVC框架
    DotLucene搜索引擎Demo之:创建索引
    超低密度SiO2气凝胶的制备及成型研究
    使用System.out.print/prilntln() 输出时存在的问题
    对C++对象实例化的测试
  • 原文地址:https://www.cnblogs.com/webber1992/p/6209277.html
Copyright © 2011-2022 走看看