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也会随之改变

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

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

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

  • 相关阅读:
    5分钟了解为什么学习Go
    jieba gensim 相似度实现
    functiils.lru_cache缩短递归时间
    python深浅copy和赋值
    ajax上传文件 基于jquery form表单上传文件
    form组件类 钩子函数验证
    基于jquery读取input上传的文件内容
    MongonDB指令汇总
    冥想编程
    《如何阅读一本书》读书笔记
  • 原文地址:https://www.cnblogs.com/arrow-kejin/p/8972047.html
Copyright © 2011-2022 走看看