python中的深浅复制

复制列表(或多数内置的可变集合),最简单的方式是使用内置的类型构造方法

l1 = [1,2,3]
l2 = list(l1)
l3 = l1[:]

l2l3实现的效果是一样的, 但是这种复制只是浅复制.即只复制了最外层容器,副本中的元素是源容器元素的引用. 如果有可变的元素(如列表嵌套列表),就会产生问题.

l1 = [3, [6, 5, 4], (7, 8, 9)]
l2 = list(l1)
l1.append(100)
l1[1].remove(5)
print('l1', l1)
print('l2', l2)
l2[1] += [33, 22]
l2[2] += (10, 11)
print('l1', l1)
print('l2', l2)
l1 [3, [6, 4], (7, 8, 9), 100]
l2 [3, [6, 4], (7, 8, 9)]

l1 [3, [6, 4, 33, 22], (7, 8, 9), 100]
l2 [3, [6, 4, 33, 22], (7, 8, 9, 10, 11)]

通过此网址的交互式demo可以看到它的状态如下:
在这里插入图片描述
l1添加100对于l2没有影响
l1删除列表中的元素时,因为列表是可变的对象,l2中的值也会改变,这是因为他们指向同一个地址,副本共享内部对象的引用.
l2增加元组中的元素时,对l1没有影响,这是因为元祖是不可变的,+=运算符相当于重新创建了一个新的元组.

为任意对象做深浅复制

class Bus:
    def __init__(self, passengers = None):
        if passengers is None:
             self.passengers = []
        else:
            self.passengers =list(passengers)
    def pick(self, name):
        self.passengers.append(name)
    def drop(self, name):
        self.passengers.remove(name)
import copy
bus1 = Bus(['alice', 'bill', 'claire', 'david'])
bus2 = copy.copy(bus1)
bus3 = copy.deepcopy(bus1)
id(bus1), id(bus2), id(bus3)

(140419270432584, 140419270432640, 140419270432864)

bus1.drop('bill')
bus2.passengers
bus3.passengers

['alice', 'claire', 'david']
['alice', 'bill', 'claire', 'david']

id(bus1.passengers), id(bus2.passengers), id(bus3.passengers)

(140419339067656, 140419339067656, 140419279593672)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值