Python 中浅复制与深复制浅析

在编程语言中,复制的比较都是一个不可避免的话题,Python中也不例外。被复制的对象通常为各种数据,包括基本数据类型(int、long、float、bool、str、…)和数据结构(dict、list、set、tuple、…)。
我们通常的‘=’方法或copy.copy()为浅复制,而深复制为copy.deepcopy()。顾名思义,浅复制即复制的深度较浅,只复制数据的存储地址;深复制即复制的深度较深,可以复制到数据的值。

1、对基本数据类型来说,深复制与浅复制意义相同,因为它们的存储地址内存放其值;

        In [1]: s1 = 'copy and deepcopy'

        In [2]: s2 = s1

        In [3]: s3 = s1

        In [4]: s1 = 'whatever'

        In [5]: s1
        Out[5]: 'whatever'

        In [6]: s2
        Out[6]: 'copy and deepcopy'

        In [7]: s3
        Out[7]: 'copy and deepcopy'

2、对数据结构来说,生成数据结构(如列表)时,就自动生成存储地址来存放该数据结构,该数据结构中的每个元素也都有自身的存储地址。浅复制只是复制到该数据结构的存储地址层面,该数据结构的存储地址内的元素改变,则指向该地址的所有数据结构也都随之改变。而深复制则是复制到最深层存储地址(基本数据类型),相当于重新生成一个存储地址,与之前的地址无关。

    In [1]: a = [1,2,3]

    In [2]: b = a

    In [3]: c = a

    In [4]: b.append(8)

    In [5]: b
    Out[5]: [1, 2, 3, 8]

    In [6]: a
    Out[6]: [1, 2, 3, 8]

    In [7]: c
    Out[7]: [1, 2, 3, 8]

    In [1]: import copy

    In [2]: l = [1,2,3]

    In [3]: l2 = copy.deepcopy(l)

    In [4]: l.append(8)

    In [5]: l
    Out[5]: [1, 2, 3, 8]

    In [6]: l2
    Out[6]: [1, 2, 3]

“`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值