• python 深拷贝和浅拷贝



    Python专门提供了一种拷贝机制,基于原对象创建一个含有相同值的对象。拷贝有copy模块提供。讲到拷贝就不得不讲一下可变和不可变对象。

    可变对象

    当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,称之为可变对象。
    数据类型:list,set,dict

    不可变对象

    当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,称之为可变数据类型。
    数据类型:num,str,tuple等

    浅拷贝

    是对于一个对象的顶层拷贝,也就是说拷贝引用。

    • 对列表切片拷贝:[:]
    • 调用对象拷贝:list.copy
    • 模块:copy.copy

    深拷贝

    是对于一个对象的内容拷贝。

    • 模块:copy.deepcopy()

    那么它们的异同在哪呢?

    可变对象 不可变对象
    浅拷贝 拷贝外面的对象,里面元素不拷贝 拷贝新对象
    深拷贝 对象和里面的元素都拷贝 拷贝新对象

    实例

    import copy
    # 可变对象数据
    change_variable=[1,2,45,6,0]
    # 不可变对象数据
    not_variable=(3,5,2,1,)
    
    # 浅拷贝:拷贝引用(可变)
    change_shallow_list=change_variable[:]
    # 深拷贝:拷贝内容(可变)
    change_deep_list=copy.deepcopy(change_variable)
    
    # 浅拷贝:拷贝引用(不可变)
    not_shallow_tuple=copy.copy(not_variable)
    # 深拷贝:拷贝内容(不可变)
    not_deep_tuple=copy.copy(not_variable)
    
    # 当浅拷贝对象发生改变时
    change_shallow_list[-1]='改变'
    change_deep_list[1]='改变了'
    
    # 当深拷贝对象发生改变时
    try:
        not_shallow_tuple[0]=111
    except Exception as f:
        print(f,'
    元组不管是什么拷贝,本身不可变')
    try:
        not_deep_tuple[-1]='深拷贝'
    except Exception as f:
        print(f,'
    元组不管是什么拷贝,本身不可变')
    
    print('可变对象l:	{}'.format(change_variable))
    print('不可变对象t:	{}'.format(not_variable))
    print('浅拷贝可变对象:	{}'.format(change_shallow_list))
    print('深拷贝可变对象:	{}'.format(change_deep_list))
    print('浅拷贝不可变对象:	{}'.format(not_shallow_tuple))
    print('深拷贝不可变对象:	{}'.format(not_deep_tuple))
    
  • 相关阅读:
    CouchDB
    在 Fabric 中使用私有数据
    Hyperledger Fabric 踩坑汇总
    书单
    HyperLedger Fabric 资料网址大全
    Hyperledger composer
    Hyperledger Fabric
    [转]以太坊智能合约编程之菜鸟教程
    [转]Ethereum-智能合约最佳实践
    [转]工作量证明(PoW)权益证明(PoS)和委任权益证明(DPoS)区别
  • 原文地址:https://www.cnblogs.com/Ink-kai/p/12470536.html
Copyright © 2020-2023  润新知