赋值
对象之间赋值本质上 是对象之间的引用传递而已。也就是多个对象指向同一个数据空间。
>>> a = [11,22]
>>> b = a
>>> id(a)
2002127137352
>>> id(b)
2002127137352
浅拷贝
浅拷贝
:对一个对象的顶层数据的拷贝,里面是引用原被拷贝变量的地址空间
>>> a = [11,22]
>>> b = [1,2]
>>> c = [a,b]
>>> id(a)
2002126897352
>>> id(b)
2002126167752
>>> id(c)
2002127135304
>>> import copy
>>> d = copy.copy(c)
>>> id(d)
2002127137352
>>> id(d[0])
2002126897352
>>> id(d[1])
2002126167752
>>> a.append(13)
>>> c
[[11, 22, 13], [1, 2]]
>>> d
[[11, 22, 13], [1, 2]]
深拷贝
深拷贝
:对于一个对象所有层次的递归拷贝,开辟新的地址空间且全部拷贝,无论后来被拷贝变量如何改变,均无关。
>>> a = [11,22]
>>> b = [1,2]
>>> c = [a,b]
>>> d = copy.deepcopy(c)
>>> c
[[11, 22], [1, 2]]
>>> d
[[11, 22], [1, 2]]
>>> id(c)
2002127761032
>>> id(d)
2002127135304
>>> id(c[0])
2002127760968
>>> id(d[0])
2002127760648
>>> c.append(33)
>>> c
[[11, 22], [1, 2], 33]
>>> d
[[11, 22], [1, 2]]
赋值与拷贝的区别
赋值是引用的改变,而拷贝是重新开辟一片空间
深拷贝与浅拷贝的区别
浅拷贝只是拷贝最外层数据,而深拷贝是递归拷贝所有层数据。
python中大部分方法都是浅拷贝(如切片)
, 为什么呢?
浅拷贝花费时间更少,内存更少,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。
对不可变数据类型和可变数据类型的copy不同
- copy.copy对于可变类型,会进行浅拷贝,
- copy.copy和copy.deepcopy对于不可变类型没有意义,全部等价于对象之间的赋值操作。
拷贝为列表
拷贝为元组
若浅拷贝拷贝为元组 ,那么他不会进行,壳也不会拷贝,仅仅是引用、指向