不妨从用法上看
>>> import copy
>>> a = [1, 2, 3, [4, 5, 6]]
>>> b = copy.deepcopy(a)
>>>
- 数据只有“一层”的话,使用分片或内置方法
copy()
或 copy.copy
就行
>>> a = [1, 2, 3]
>>> b = a[:]
>>> c = a.copy()
>>>
>>> import copy
>>> d = copy.copy(a)
>>>
>>> a = [1, 2, 3]
>>> b = list(a)
补充
- 复合对象谈深、浅拷贝才有意义
- 复合对象:包含其他对象的对象,如列表、类实例等
- 浅拷贝只拷贝第一层元素,故又称“顶层拷贝”
- 若超过一层,浅拷贝后,“外壳”指向新的空间,其内部的元素仍指向原对象内部的元素
- 可以认为 Python 能“偷懒”时必“偷懒”,有变化才分配内存
copy.deepcopy
也不是万能的,必要的时候可以重写方法
- 常见的不可变对象,如
str
, int
, float
, complex
, bool
,可以放心拷贝
tuple
有点特殊,虽然是不可变对象,但有层数,所以拷贝时需要注意“深浅”
- 常见的可变对象,如
list
, dict
,拷贝时需要注意“深浅”
set
有点特殊,虽然是可变对象,但它的元素是可哈希的,也就意味着它里面是不可变对象,所以可以放心拷贝