口诀: 你变我就变, 你不变我也不变,
嵌套类型看底层元素, 看到本质,
再解释就是说,
拷贝时, 如果数据本质是可变类型, 考虑到安全性问题, 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))