一句话让你明白 python高级语法中的 深浅拷贝

口诀: 你变我就变, 你不变我也不变, 

嵌套类型看底层元素, 看到本质,

 

再解释就是说,

 拷贝时, 如果数据本质是可变类型, 考虑到安全性问题, Python会重新开辟一块新的地址保存.地址发生变化

如果数据本质是不可变类型, 那么深浅拷贝都是地址的引用, 没有办法就是真么强大, 无法撼动id.

(如果底层有可变类型,  即使顶层元素是个不可变类型, 比如元组.   ---其本质还是可变的 )

ps :

浅拷贝 : 就是拷贝顶层的元素

深拷贝 :  这就是,, 顶层, 底层全部的拷贝.

 

下面是测试代码::::

import copy


# ------------------------------不可变类型(浅拷贝)
# 浅: 不变
# 深: 不变
a = 10
b = copy.copy(a)
c = copy.deepcopy(a)
print("整形:", id(a), "b:", id(b), "c:", id(c))
#
a = (1, 3)
b = copy.copy(a)
c = copy.deepcopy(a)
print("元祖:", id(a), "b:", id(b), "c:", id(c))



# # # ------------------------------可变类型(浅深拷贝)
# 浅:  变
# 深:  变
a = [1, 3]
print("没拷贝:", "a:", id(a), "a0:", id(b[0]), "b1:", id(b[1]))
b = copy.copy(a)
print("浅拷贝:", "b:", id(b), "b0:", id(b[0]), "c1:", id(b[1]))
c = copy.deepcopy(a)
print("深拷贝:", "c:", id(c), "c0:", id(c[0]), "d1:", id(c[1]))

d = a
print("赋值啥也不变:", "d:", id(d), "d0:", id(d[0]), "d1:", id(d[1]))



# -----------------------列表中(列表+元组)
# 浅;  变 ,不变, 不变
# 深:  变 ,变 , 不变
a = [1, 2]
b = (3, 4)
print("a:", id(a), "b:", id(b))
c = [a, b]
print("没拷贝:", "c:", id(c), "a:", id(c[0]), "b:", id(c[1]))
d = copy.copy(c)
e = copy.deepcopy(c)
print("浅拷贝:", "d:", id(d), "a:", id(d[0]), "b:", id(d[1]))
print("深拷贝:", "e:", id(e), "a:", id(e[0]), "b:", id(e[1]))




# # ----------------------元组中(列表+元组)
# 浅;  不变, 不变, 不变
# 深:   变, 变 , 不变
a = [1, 2]
b = (3, 4)
print("a:", id(a), "b:", id(b))
c = (a, b)
print("没拷贝:", "c:", id(c), "a:", id(c[0]), "b:", id(c[1]))
d = copy.copy(c)
e = copy.deepcopy(c)
print("浅拷贝:", "d:", id(d), "a:", id(d[0]), "b:", id(d[1]))
print("深拷贝:", "e:", id(e), "a:", id(e[0]), "b:", id(e[1]))




a = [1, 2]
b = [3, 4]
c = [a, b]
d = c[:]
print(d)
print(id(c), id(d))

c[0][0] = 90
print(d)
print(id(c), id(d))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值