Code | python赋值、深拷贝和浅拷贝

  1. 简单赋值:a = b, 实际上是一种引用,对b起了一个别名a.
  2. 浅拷贝:a = b.copy(), 将b所指的第一层对象拷贝,另外开辟存储空间,起名为a.
  3. 深拷贝:需先import copy, a = copy.deepcopy(b), 深层拷贝b的所有对象。

首先明确,对于原子级别的元素,如数字,字符等,只存在引用赋值。

深浅拷贝指针对容器类型的变量而言。

浅拷贝:a=[1, 2, [3, 4]], b=a.copy(), 此时,另开辟一块内存,存放列表所组织的元素(地址),元素分别是1,2,[3,4]三个,与a是同样的三个子对象(地址),并未另行拷贝(另开辟地址存放三个子对象)。也就是说,浅拷贝,只拷贝了浅层的对象:元素组织情况(三个地址)。修改b[0],a不受影响,因为所修改的是原子类型数字,b[0]指向新的元素地址。修改b[2]=1, b的第三个元素变化,即指向了新地址,a不受影响。修改b[2][1], 访问了子对象[3, 4]并修改,由于这个对象[3,4]属于a,b公用,所以a随之变化。

 

深拷贝:a=[1, 2, [3, 4]], b=copy.copy(a), 此时,另开辟内存,存放新列表(即存放列表元素所在地址),并且另开辟地址,存放拷贝的各个子元素(1,2是原子类型,无所谓拷贝形式,仍然是一样的地址, 而[3,4],深拷贝另行拷贝一份,存于不同的地址,因此a,b拥有的第三个元素[3,4]不同)

对于浅拷贝:
id(a) != id(b)
id(a[0]) == id(a[0])
id(a[2]) == id(a[2])

对于深拷贝:
id(a) != id(b)
id(a[0]) == id(a[0])
id(a[2]) != id(a[2])

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值