import copy
#对于字典、元祖、列表 而言，进行赋值、浅拷贝和深拷贝时，其内存地址的变化是不同的。
#对于 数字 和 字符串 而言，赋值、浅拷贝和深拷贝无意义，因为其永远指向同一个内存地址。

a={'a1':{'a2':'a2','a3':[1,2,3,4],'a4':123},'a5':[1,1,[2,2]]}
b=a #直接将引用传递给了b，完全相互影响
c=a.copy() #浅拷贝，在内存中只额外创建第一层数据
d=copy.deepcopy(a) #深拷贝，在内存中将所有的数据重新创建一份（排除最后一层，即：python内部对字符串和数字的优化）

#改变b中非字典类型的value
>>> b['a5']=[3,3,[4,4]]
>>> b
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> c
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}
>>> a
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> d
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}


#改变b中字典类型的value的value
>>> b['a1']['a2']='b_change_a2'
>>> a
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'b_change_a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> b
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'b_change_a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> c
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'b_change_a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}
>>> d
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}


#改变c中字典类型的value的value
>>> c['a1']['a2']='c_change_a2'
>>> a
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> b
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> c
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}
>>> d
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}

#改变d中字典类型的value的value
>>> d['a1']['a2']='d_change_a2'
>>> a
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> b
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> c
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}
>>> d
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'd_change_a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}

#改变a中字典类型的value的list中的值
>>> a['a1']['a3'][0]='a_change_a3_list'
>>> a
{'a1': {'a3': ['a_change_a3_list', 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> b
{'a1': {'a3': ['a_change_a3_list', 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [3, 3, [4, 4]]}
>>> c
{'a1': {'a3': ['a_change_a3_list', 2, 3, 4], 'a2': 'c_change_a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}
>>> d
{'a1': {'a3': [1, 2, 3, 4], 'a2': 'd_change_a2', 'a4': 123}, 'a5': [1, 1, [2, 2]]}


#改变list  b 会影响c中所有层的value
>>> a=1
>>> b=[2,2,[2,2]]
>>> c={'c1':a,'c2':b,'c3':{'c4':b,'c5':a}}
>>> c
{'c3': {'c4': [2, 2, [2, 2]]}, 'c2': [2, 2, [2, 2]], 'c1': 1}
>>> b[0]=0
>>> c
{'c3': {'c5': 1, 'c4': [0, 2, [2, 2]]}, 'c2': [0, 2, [2, 2]], 'c1': 1}

#改变a却不会影响c
>>> a=111
>>> c
{'c3': {'c5': 1, 'c4': [0, 2, [2, 2]]}, 'c2': [0, 2, [2, 2]], 'c1': 1}

#总结引用的传递，值传递VS传引用


