python中深拷贝和浅拷贝的区别

copy(浅拷贝)

只会拷贝表层元素

deepcopy(深拷贝)

同时拷贝表层和内层(子层)元素, 在内存中重新创建所有子元素

示例1
from copy import copy, deepcopy

a = [1, 2, 3, [4, 5, 6]]
b = copy(a) # 浅拷贝
c = deepcopy(a) # 深拷贝

b[1] = 8
b[3][0] = 8

c[1] = 9
c[3][0] = 9

print(a) # [1, 2, 3, [8, 5, 6]]
print(b) # [1, 8, 3, [8, 5, 6]]
print(c) # [1, 9, 3, [9, 5, 6]]
示例2
def extendList(val, lst=[]):
    lst.append(val)
    return lst

list1 = extendList(10) # [10]
list2 = extendList(123, []) # [123]
list3 = extendList('a') # [10, 'a']

print(list1) # [10, 'a']
print(list2) # [123]
print(list3) # [10, 'a']
示例3
from copy import copy, deepcopy
from pickle import dumps, loads

a = ['x', 'y', 'z']
b = [a] * 2 # [['x','y','z'], ['x','y','z']]
c = copy(b)
d = deepcopy(b)

# 先序列化, 再反序列化 dumps(xxx, 4) 第二个参数是协议,可以是0-4, 数字越大, 序列化的时间越快
# 功能和深拷贝一致
e = loads(dumps(b, 4))
b[1].append(999) # [['x','y','z', 999], ['x','y','z', 999]]
b.append(777) # [['x','y','z', 999], ['x','y','z', 999], 777]

c[1].append(999) # [['x','y','z', 999, 999], ['x','y','z', 999, 999]]
c.append(555) # [['x','y','z', 999, 999], ['x','y','z', 999, 999], 555]

d[1].append(999) # [['x','y','z', 999], ['x','y','z', 999]]
d.append(333) # [['x','y','z', 999], ['x','y','z', 999], 333]

e[1].append(999) # [['x','y','z', 999], ['x','y','z', 999]]
e.append(111) # [['x','y','z', 999], ['x','y','z', 999], 111]

图解
在这里插入图片描述

手动实现深拷贝

# 自定义实现深拷贝
from pickle import loads, dumps

my_deepcopy = lambda item: loads(dumps(item, 4))

a = my_deepcopy([1, 2, 3, [4, 5, 6]])
a[3][0] = 9
print(a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值