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

你变我就变, 你不变我也不变,

 嵌套类型看底层元素, 看到本质,  方法同样适用.


再解释就是说,

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

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

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

ps :

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

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


下面是测试代码::::

import copy


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



# # # ------------------------------可变类型(浅深拷贝)
# # 浅:  变
# # 深:  变
# a = [1, 3]
# print("没拷贝:", "a:", id(a))
# b = copy.copy(a)
# print("浅拷贝:", "b:", id(b),     "a0:", id(b[0]), "b1:", id(b[1]))
# c = copy.deepcopy(a)
# print("深拷贝:", "c:", id(c),     "a0:", id(c[0]), "b1:", id(c[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))

猜你喜欢

转载自blog.csdn.net/hh2030/article/details/80948022