python的deepcopy大坑

运行下面的代码,看看结果会输出什么?

from copy import deepcopy

a = [[0, 1, 2, 3], [2, 3]]

max_len = max([len(item) for item in a])

for i in range(len(a)):
    b.append(a[i])
    # b.append(deepcopy(a[i]))

for i in range(len(b)):
    need_len = max_len - len(b[i])
    b[i].extend([0]*need_len)

print(b)
print(a)

可以看到,a的值也被改变了。是因为python的复制机制,copy对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是复杂对象的子对象。对于子对象,python会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。

上面代码中,列表a中的每一个元素都是a这个复杂对象的子对象,所以b中的元素只是a中对应元素的引用,b和a其实是同一个东西,所以对b做操作,a也会变。deepcopy则不同,它会在内存中复制两份,而不是一个引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值