python中的引用、浅拷贝和深拷贝

       变量名和对象之间,存在引用的关系,即变量名通过引用指向对象,而对象和其在内存中的数据又存在复杂关系,在python中的对象是一种高级抽象,所以并没有简单的指针概念。对象本身在内存中是一个独立的存在,一个对象的值可能包含多个其他对象的值的指针,也就是共享内存。当两个变量具有相同的引用时,那么这两个变量肯定具有相同的内存地址,因为它们指向了同一个对象;而两个不同的对象具有不同的内存地址,但是其子值可能是共享内存的,比如两个列表对象,共享一个子列表对象。例如下面的l1和l2具有相同的引用,所以其指向同一个对象,具有相同的内存地址,不涉及任何复制;而l3和l4虽然是不同对象,具有不同的内存地址,但是其共享l1的值所在的内存。所以当修改了l1时,l2、l3和l4都会改变。

l1 = [1,2]
l2 = l1
l3 = [1,l1]
l4 = l3.copy()

       上面的copy函数实际上是一种浅拷贝,也就是其只拷贝父对象,不会拷贝父对象下的子对象,即l4不会拷贝l3中的l1,而是和l3共享l1。但是如果我们不想让l4和l3有任何的关联,那么可以通过深拷贝实现,深拷贝就是完全在内存中复制一个全新的对象,两者完全独立。而深拷贝需要通过导入python的内置库copy,然后copy库的deepcopy函数来实现深拷贝,如下所示,l5是l3的一个深拷贝,这时l5和l3在内存中完全独立,不会相互影响。

import copy
l5 = copy.deepcopy(l3)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值