Python理解 浅拷贝和深拷贝deepcopy

Python默认是浅拷贝,比如使用拷贝一个列表l1 使用l2=list(l1) 或者l2=l1[:] 都是浅拷贝。  (l2=l1这不是拷贝,这是别名,多了一个引用)

浅拷贝:只复制了最外层的容器,副本中的元素是源容器中元素的引用。如果所有元素都是不可变的,那么这样没问题,还能节省内存。但是浅拷贝中有可变的元素,会导致很多想不到的问题。

 

l1 = [3, [66, 55, 44], (7, 8, 9)]
l2 = list(l1)  # 浅拷贝,此时l1 is l2 = FALSE
l1.append(100)  # 对l2没有英雄
l1[1].remove(55)  # 对l2有影响,因为l1[1]和l2[1]绑定的列表是同一个

print(l1)
print(l2)

l2[1] += [33, 22]  # +=可变类型来说,会就地修改列表。l1和l2都引用了这个列表
l2[2] += (10, 11)  # +=对于元组这种不可变类型,会创建一个新的元组,然后重新绑定给变量l2[2]。此时l1和l2最后一个元组不是同一个对象了。

print(l1)
print(l2)
打印
[3, [66, 44], (7, 8, 9), 100]
[3, [66, 44], (7, 8, 9)]
[3, [66, 44, 33, 22], (7, 8, 9), 100]
[3, [66, 44, 33, 22], (7, 8, 9, 10, 11)]

知识点:

+=增量赋值运算符,对于列表来说,会修改原列表。对于元组这种不可变序列,会创建一个新的元组。

 

深拷贝:拷贝的副本不共享内部对象的引用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值