m = [1, 2, [3, 4], [5, [6, 7]]]
假拷贝:n = m
浅拷贝(shallow copy)
- 主要操作有:
copy.copy
,a=b.copy()
,a=b[:]切片
深拷贝(deep copy)
- 主要操作有:
copy.deepcopy
总结:
- 浅拷贝只是新建了外层的可变对象,内部元素还是和原对象的内部元素指向内存一样,因此浅拷贝的可变对象 元素的修改会相互影响;
- 深拷贝不仅新建了外层的可变对象,还为内部元素中的可变对象元素新建了对象,因此深拷贝的可变对象元素的修改相互不会影响。
- 由于在Python中 相同的不可变对象是共享内存的(ps:在交互式解释器Ipython中,只有-5~256的整数是共享内存的),因此深拷贝中的内部元素的不可变对象的id是相同的(如下图),当对不可变对象进行修改时,会分配并指向另一块内存。
补充:
为什么Python默认的拷贝方式是浅拷贝?
- 浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高(时间少,占用内存小)。