什么是浅克隆,什么是深克隆
克隆简而言之就是得到一个一模一样的对象.
浅克隆
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象引用,而不复制它所引用的对象.如下图可知,浅复制仅仅复制了最外层对象的引用,而对象里的引用仍然是共用的.
eg. 假设A对象里面有个引用的属性是a(也是一个对象),假设B是浅克隆后的对象,那么B中的a与A中的a的id是一样的,也就是说a属性并没有被克隆,被克隆的只有A对象的引用.浅克隆意味着在B中改变a的属性值,那么A中a的属性值也随之改变.
深克隆
深克隆就是什么都复制过来了,两个对象没有共用的任何属性或其他东西.如下图,两个对象从此是毫不相关的,除了属性的值一样.
eg. 假设A对象里面有个引用的属性是a(也是一个对象),假设B是深克隆后的对象,那么B中的a与A中的a的id是**不一样**的,也就是说a属性也被克隆,A对象中的所有东西都被递归克隆了.
明确了浅克隆和深克隆的概念之后我们继续学习python中的浅克隆与深克隆.
python默认浅克隆
- 内置类型中的构造方法都是浅克隆,如list(),
>>> a = [1,2,[]]
>>> # 这里是浅克隆
>>> b = list(a)
>>> a is b
False
>>> a == b
True
>>> #改变b列表中的最后一个列表元素添加内容,同时会影响a列表中的元素
>>> b[-1].append(3)
>>> a
[1, 2, [3]]
>>> b
[1, 2, [3]]
- 切片是浅克隆
>>> a = [1, []]
>>> 此处是浅复制
>>> b = a[:]
>>> a is b
False
>>> a == b
True
>>> 改变b的同时也会影响a
>>> b[-1].append(2)
>>> a
[1, [2]]
>>> b
[1, [2]]
深克隆
使用copy模块中的deepcopy方法可以实现深克隆,使用copy模块中的copy方法可以实现浅克隆.