python浅拷贝与深拷贝

浅拷贝与深拷贝

浅拷贝

a = [1, [2, 3]]
b = copy.copy(a)

b只复制了a的引用,未复制a引用对象的引用

import copy

a = [1, [2, 3]]
b = copy.copy(a)

print(a)
print(id(a), 'a')
print(id(a[0]), 'a[0]')
print(id(a[1]), 'a[1]')
print(id(a[1][0]), 'a[1][0]')
print(id(a[1][1]), 'a[1][1]')
print(b)
print(id(b), 'b')
print(id(b[0]), 'b[0]')
print(id(b[1]), 'b[1]')
print(id(b[1][0]), 'b[1][0]')
print(id(b[1][1]), 'b[1][1]')

print('=============')

b[1][0] = 0

print(a)
print(id(a), 'a')
print(id(a[0]), 'a[0]')
print(id(a[1]), 'a[1]')
print(id(a[1][0]), 'a[1][0]')
print(id(a[1][1]), 'a[1][1]')
print(b)
print(id(b), 'b')
print(id(b[0]), 'b[0]')
print(id(b[1]), 'b[1]')
print(id(b[1][0]), 'b[1][0]')
print(id(b[1][1]), 'b[1][1]')

输出

请添加图片描述

保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C48477%5CDesktop%5Cpython%5Cimage-20231102214039203.png&pos_id=img-nkwjJEEg-1698935085954)

易得,虽然a与b引用对象id不同,但其列表之下的引用皆相同。

若改变其中二元列表中的值,则原列表值也会改变改变一元列表的值不会出现此情况

内存情况:

请添加图片描述

b只复制了a的引用,未复制a引用对象的引用

a引用对象的引用被b的引用对象直接引用了,二者指向的是同一对象

而在之前对象的传递中可知

传递可变对象(列表,字典等)时,实际传递的是对象的引用(id),当进行赋值操作时,会直接对原对象数值进行操作

传递不可变对象(数字,元组)时,实际传递的也是对象的引用(id),当进行赋值操作时,会创建新对象进行操作而不改变原对象

由此可得

当改变b[0]时,因为b[0]为不可变对象,所以进行赋值操作时会创建新对象进行替代,所以b[0]的改变不会引起a[0]的改变

请添加图片描述

当改变b[1] [0]或者b[1] [1]时,因为b[1] [0]和b[1] [1]皆为可变对象,所以进行赋值操作时会直接改变原对象,所以b[1] [0]或者b[1] [1]的改变会引起a[1] [0]或者a[1] [1]的改变

请添加图片描述

深拷贝

a = [1, [2, 3]]
b = copy.deepcopy(a)

b不仅复制了a的引用,也复制了对象的内存地址

import copy

a = [1, [2, 3]]
b = copy.deepcopy(a)

print(a)
print(id(a), 'a')
print(id(a[0]), 'a[0]')
print(id(a[1]), 'a[1]')
print(id(a[1][0]), 'a[1][0]')
print(id(a[1][1]), 'a[1][1]')
print(b)
print(id(b), 'b')
print(id(b[0]), 'b[0]')
print(id(b[1]), 'b[1]')
print(id(b[1][0]), 'b[1][0]')
print(id(b[1][1]), 'b[1][1]')

print('=============')

b[1][0] = 0

print(a)
print(id(a), 'a')
print(id(a[0]), 'a[0]')
print(id(a[1]), 'a[1]')
print(id(a[1][0]), 'a[1][0]')
print(id(a[1][1]), 'a[1][1]')
print(b)
print(id(b), 'b')
print(id(b[0]), 'b[0]')
print(id(b[1]), 'b[1]')
print(id(b[1][0]), 'b[1][0]')
print(id(b[1][1]), 'b[1][1]')

输出

请添加图片描述

易得,除a与b外,a[1]与b[1]的对象id也不同

此时若改变二元列表中的值,原列表也不会发生改变

内存情况:

请添加图片描述

b既复制了a的引用,也复制了a引用对象的引用,并创建了新的对象进行存储

此时,无论改变b中的哪个对象,a都不会发生改变

请添加图片描述

相较于浅拷贝引用同一个对象,深拷贝中的每一个对象都已被复制,创建为新的独立对象,因此a不会再随b而改变

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值