笔记-python-standard library-8.10 copy
笔记-python-standard library-8.10 copy
1. copy
source code:Lib/copy.py
python中的赋值语句不复制对象,它创建了对象和目标之间的指向/绑定。
对于可变对象来说,有时需要一个复制体,而非引用,本模块提供了shallow copy和deep copy操作。
接口函数:
copy.copy(x) 返回一个shallow copy
copy.deepcopy(x) 返回一个deep copy
exception copy.error 抛出模块特定错误
浅复制和深复制的区别:
- 两者之间的区别主要是针对复杂对象而言的,例如列表和类实例。
- 浅复制复制对象但不复制引用体。
- 深复制复制对象,同时递归的去寻找它在原始对象的内容并复制。
深复制通常会存在两个问题,而浅复制不会:
- 递归对象可能会导致递归循环;
- 深复制可能会复制太多不必要的内容,比如应该在两个对象之间共享的内容。
针对上述问题,深拷贝通过以下方式避免:
- 保留一个“memo”字典用于描述拷贝的对象。
- 让用户定义的类覆盖掉复制操作或复制过来的组件。
1.1.1. example
import copy
la = [1, 2, 3, ['a', 'b', 'c']]
lb = la
print(id(lb) == id(la)) #True
# copy
lb = copy.copy(la)
print(id(lb) == id(la)) #False
print(id(lb[3]) == id(la[3])) #True
# deep copy
lb = copy.deepcopy(la)
print(id(lb) == id(la)) #False
print(id(lb[3]) == id(la[3])) #False
解释:
python中变量全是对象/引用,因此变量都是指向的内存区域的一个引用,判断变量指向的内存区域是否相同可以判断是否同一对象。
浅拷贝时la和lb的指向不同了,但内部的引用la[3]和lb[3]的指向仍是相同的。可见只复制了引用a[3]而没有复制引用指向的对象。
在深拷贝中a[3]和b[3]指向的内存是不一样的,可见复制了引用对象。
使用la[3] is lb[3]效果应该是一样的。
日拱一卒无有尽,功不唐捐终入海

浙公网安备 33010602011771号