先总的概括一下
- 赋值,这里不是我们所熟知的简单的赋值了,赋的是对原对象的引用,表面是俩人儿,暗地里却穿一条裤子
- 浅拷贝,只复制了原对象的表面,更深层次的还是在以引用的形式传递
- 深拷贝,完完全全就是简单复制了原对象的数据组织方式和数据,成为一个彻头彻尾新的对象
>>> import copy
>>> a = [1, 2, 3,['a', 'b']]
>>> b = a #赋值
>>> c = copy.copy(a) #浅拷贝
>>> d = copy.deepcopy(a) #深拷贝
>>> print(a);print(b);print(c);print(d)
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']] #目前看来,复制之后的东西表现的一样
>>> a.append(5) #现在我们来改变以下原对象a
>>> print(a);print(b);print(c);print(d)
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
#至此,我们看到,他们的反应开始出现差异,赋值得到的b随着a的变化而变化
#通过浅拷贝和深拷贝得到的c和d并没有发生改变
>>> a[3].append('c') #然后我们尝试改变了原对象a的子对象的值,再看看他们的反应
>>> print(a);print(b);print(c);print(d)
[1, 2, 3, ['a', 'b', 'c'], 5]
[1, 2, 3, ['a', 'b', 'c'], 5]
[1, 2, 3, ['a', 'b', 'c']]
[1, 2, 3, ['a', 'b']]
>>>
#好了,这下热闹了,赋值得到的b仍然坚决拥护a的决定,积极响应
#浅拷贝得到的c这把也开始有所响应
#只有深拷贝仍然坚持己见,保持原有的模样