赋值:
对象之间的赋值本质上是对象之间的引用的传递而已,也就是多个对象指向同一个数据空间。
浅拷贝:
浅拷贝是对一个对象的顶层数据的拷贝
- 浅拷贝 copy.copy(x)
- 切片操作 x[:]
- copy方法 x.copy()
深拷贝:
深拷贝是对于一个对象所有层次的拷贝(递归)
copy.deepcopy(x)
为什么Python中大多数都是浅拷贝呢?
- 时间角度,浅拷贝花费时间更少
- 空间角度,浅拷贝花费内存更少
- 效率角度,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。
注意:
- copy.copy和copy.deepcopy对于不可变类型没有意义,全部等价于对象之间的赋值操作。
- copy.copy()对于可变类型,会进行浅拷贝
问题:
b = [9,9,9]
a = [1,2,3,b]
c = copy.copy(a)
d = copy.deepcopy(a)a[0] = 9
请问c和d值分别是多少# 修改的a[0]即为1,是不可变数据类型,所以此时a=[9,2,3,[9,9,9]],但c、d的指向不变
c = [1,2,3,[9,9,9]]
d = [1,2,3,[9,9,9]]a[3][2] = 10
请问c和d值分别是多少# 修改的a[3][2]即[9,9,9]为可变数据类型,由于c为a的浅拷贝所以c的指向会发生改变,d为a的深拷贝所有指向不会改变
c = [1,2,3,[9,9,10]]
d = [1,2,3,[9,9,9]]