import copy
a = [1,2,3,4]
id(a)
# 4386320704
b = copy.copy(a) # 浅拷贝
id(b)
# 4384379840
c = a # 赋值
id(c)
# 4386320704
d = copy.deepcopy(a) # 深拷贝
id(d)
# 4425048864
"""
以上可以看出,只有直接赋值的内存地址和原数据的相同,说明他们指向同一地址,
而浅拷贝和深拷贝都是新的地址
"""
a.append([5,6,7])
# a = [1, 2, 3, 4, [5, 6, 7]]
# b = [1, 2, 3, 4]
# c = [1, 2, 3, 4, [5, 6, 7]]
# d = [1, 2, 3, 4]
a.append(8)
# a = [1, 2, 3, 4, [5, 6, 7], 8]
# b = [1, 2, 3, 4]
# c = [1, 2, 3, 4, [5, 6, 7], 8]
# d = [1, 2, 3, 4]
"""
这时候改变原数据,只有直接赋值的c和a一起变化,其它的不变,为什么呢?
因为最开始拷贝的时候,原数据a中没有引用数据,都是不可变的基础数据
"""
# 现在我们重新拷贝一次
b = copy.copy(a)
# b = [1, 2, 3, 4, [5, 6, 7], 8]
d = copy.deepcopy(a)
# d = [1, 2, 3, 4, [5, 6, 7], 8]
a.append(9)
# a = [1, 2, 3, 4, [5, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [5, 6, 7], 8]
# c = [1, 2, 3, 4, [5, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]
a[3]=44
# a = [1, 2, 3, 44, [5, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [5, 6, 7], 8]
# c = [1, 2, 3, 44, [5, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]
"""
深拷贝:原数据不管怎么变,它都不会变
浅拷贝:在修改原数据的不可变变量时浅拷贝是不会变化的
直接赋值:不管原数据怎么变,它都跟着变
"""
# 现在我们变化一下a中的可变变量
a[4][0]=55
# a = [1, 2, 3, 44, [55, 6, 7], 8, 9]
# b = [1, 2, 3, 4, [55, 6, 7], 8]
# c = [1, 2, 3, 44, [55, 6, 7], 8, 9]
# d = [1, 2, 3, 4, [5, 6, 7], 8]
"""
浅拷贝:原数据不可变变量增加修改删除,它都不会跟着变;原数据可变变量的变化它回跟着变化
"""
"""
总结:
深拷贝:不管原数据怎么变,它都不会变(深度拷贝,连引用部分的数据也都直接拷贝过来)
直接赋值: 不管原数据怎么变,它都跟着变(和原数据共用一块内存地址,实际是原数据的一个引用)
浅拷贝:原数据里不可变的数据怎么变,它都不会变;原数据里可变部分怎么变,它都跟着变
(原数据不可变的部分直接拷贝,原数据引用部分仍然拷贝引用,而不是实际数据)
"""