• 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一个重要的对象时,假如里面含有管理权限的数据结构,这样可能把这些信息共享给了不具有管理权限的对象。

  • 相关阅读:
    思维导图github地址
    python操作mongodb根据_id查询数据的实现方法
    如何让nginx显示文件夹目录
    Scrapy爬虫返回302重定向问题解决方法
    K8s
    Dockerfile文件详解
    k8s简介
    mongodb存储过程
    存储过程详解
    Docker 镜像加速
  • 原文地址:https://www.cnblogs.com/webber1992/p/6209277.html
Copyright © 2020-2023  润新知