一. 前言
在操作变量与数据的时候,我们会直接进行赋值a = b(把b赋值给a),但在a改变的时候,b也改变,怎么才能避免这种情况出现那,我们可以使用python自带的copy()与deepcopy()来进行处理。
二. 可变与不可变数据的认识
mutable : 可变的,如List、Dict
immutable : 不可变的,如Number、String、Tuple、Set
Python赋值操作或函数参数传递,传递的永远是对象引用(即内存地址),而不是对象内容。
三. copy模块的学习
(1)浅拷贝只拷贝最外层对象,深拷贝还会递归拷贝内层对象。
(2)无论是浅拷贝还是深拷贝,只拷贝mutable可变对象成为一个新对象,而immutable不可变对象还是原来的那个。
(3)当顶层对象和它的子元素对象全都是immutable不可变对象时,因为没有产生新对象,所以不存在被拷贝。
3.1 浅拷贝
拷贝顶层对象,但不会拷贝内部的子元素对象
3.1.1顶层是mutable,子元素全是immutable
(1)浅拷贝之后顶层与子元素的变化

输出结果:

(2)修改子元素的值之后顶层与子元素的变化

输出结果:

3.1.2顶层是mutable,子元素部分immutable
(1)浅拷贝之后顶层与子元素的变化

输出结果:

(2)修改子元素的可变元素值之后顶层与子元素的变化

输出结果:

3.1.3顶层是immutable,子元素全是immutable

输出结果:

3.1.3顶层是immutable,子元素部分mutable
'''
浅拷贝,顶层不可变,子元素部分可变
整体id地址相同,内部子元素地址一样
a[2]与b[2]指向同一个列表,修改a[2][1]会影响b[2][1]
'''

输出结果:

总:整体浅拷贝的学习可以结合目录三.copy模块学习下的(1)(2)(3)进行对照学习。