"""特别注意！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
浅拷贝和深拷贝的不同仅仅是对组合对象来说，所谓的组合对象就是包含了其它对
象的对象，如列表，类实例。而对于数字、字符串以及其它“原子”类型，没有拷
贝一说，产生的都是原对象的引用。"""

#建议用append增加内容来判断
a=[11,22,33]
b=a
print(a is b)   #True
print(id(a))
print(id(b))

a.append(44)   #对a添加一个44元素
print(a)
print(b)       #[11, 22, 33, 44]

#操作a时，b也变了。这就是浅copy，b只是指向了a变量的内存地址

c=[1,2,3]
d=c[:]

print(d)
print(c is d)   #False  说明这就是深copy,c变量在内存有自己内存空间

#也可以导入copy模块来操作
import  copy
e=[[1,2,3],[4,5,6]]   #列表为可变类型
f=copy.copy(e)   #浅copy
print(e is f)   #False

m=([11,22,13],[4,5,6])
print(m)
n=copy.copy(m)   #浅copy
print(m is n)   #Ture    元组是不可变对象，浅copy直接指向copy元组

g=copy.deepcopy(e)    #深copy
print(e is g)   #False
print(id(g[0]),id(e[0]))  #2102279890952 2102279890760
print(id(g[0][0]),id(e[0][0]))   #[[1, 2, 3], [4, 5, 6]]  因为里面对象是不可对象


e[0].append(0)

print(e)  #[[1, 2, 3, 0], [4, 5, 6]]
print(f)  #[[1, 2, 3, 0], [4, 5, 6]]
print(g)  #[[1, 2, 3], [4, 5, 6]]







"""
总结：
1、赋值：简单地拷贝对象的引用，两个对象的id相同。
2、浅拷贝：创建一个新的组合对象，这个新对象与原对象共享内存中的子对象。
3、深拷贝：创建一个新的组合对象，同时递归地拷贝所有子对象，新的组合对象
与原对象没有任何关联。虽然实际上会共享不可变的子
对象，但不影响它们的相互独立性。


"""