zoukankan      html  css  js  c++  java
  • python对象的深复制与浅复制

    以下操作会会出现浅拷贝的情况

    • 使用切片[:]操作
    • 使用工厂函数(如list/dir/set)
    • 使用copy模块中的copy()函数

    对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)

    import copy
    class Copy_Test(object):
        def __init__(self,a):
            self.a = a
    
    a = Copy_Test('AAA')
    c = a  #给这个对象再加上一个引用
    print(id(a),id(c))  #内存地址一样
    list1 = [1,2,3,4,5,6,7,8,9]
    list2 = list1[:] #切片复制,2个地址
    list2[2] = 8899
    print(list1,list2)  #list2被改变 list无变化
    print(id(list1),id(list2))#内存地址不一样
    list3 = [1,2,3,4,5,6,[7,8,9]]
    list4 = list3[:]
    print(id(list3),id(list4))#内存地址不一样
    list4[6][1] = 88
    print(list3,list4)#因为有子列表  所以list4被改变,list3也会随之改变
    list5 = [8,[9,8,9]]
    list6 = copy.copy(list5)
    list6[1][1] = 88
    print(id(list5),id(list6))#内存地址不一样
    print(list5,list6)#因为copy是浅拷贝  所以list6被改变,list5也会随之改变
    list7 = [8,8,9,456,8,[8,946,8]]
    list8 = copy.deepcopy(list7)
    list8[-1][1] = 888
    print(id(list7),id(list8))#内存地址不一样
    print(list7,list8)#因为copy是深拷贝  所以list6被改变,list5也会随之改变

    对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单对原始元素的内存地址的引用

    对于非容器类型(如数字、字符串、和其他'原子'类型的对象)没有被拷贝一说

    如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子

  • 相关阅读:
    biji001
    公司内部openStack环境信息
    def
    CI调试
    一:Java之面向对象基本概念
    STL_算法_Heap算法(堆排)(精)
    IOS开发-经常使用站点集合
    【iOS开发-47】怎样下载iOS 7.1 Simulator 以及iOS 8离线的Documentation这些文件?
    设计模式简介
    how to deal with "no such file error or diretory" error for a new programmer in QT creator
  • 原文地址:https://www.cnblogs.com/arrow-kejin/p/8972047.html
Copyright © 2011-2022 走看看