什么是浅克隆,什么是深克隆

克隆简而言之就是得到一个一模一样的对象.
浅克隆
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象引用,而不复制它所引用的对象.如下图可知,浅复制仅仅复制了最外层对象的引用,而对象里的引用仍然是共用的.
image.png
eg. 假设A对象里面有个引用的属性是a(也是一个对象),假设B是浅克隆后的对象,那么B中的a与A中的a的id是一样的,也就是说a属性并没有被克隆,被克隆的只有A对象的引用.浅克隆意味着在B中改变a的属性值,那么A中a的属性值也随之改变.

深克隆
深克隆就是什么都复制过来了,两个对象没有共用的任何属性或其他东西.如下图,两个对象从此是毫不相关的,除了属性的值一样.
image.png
eg. 假设A对象里面有个引用的属性是a(也是一个对象),假设B是深克隆后的对象,那么B中的a与A中的a的id是**不一样**的,也就是说a属性也被克隆,A对象中的所有东西都被递归克隆了.

明确了浅克隆和深克隆的概念之后我们继续学习python中的浅克隆与深克隆.

python默认浅克隆

  • 内置类型中的构造方法都是浅克隆,如list(),
  1. >>> a = [1,2,[]]
  2. >>> # 这里是浅克隆
  3. >>> b = list(a)
  4. >>> a is b
  5. False
  6. >>> a == b
  7. True
  8. >>> #改变b列表中的最后一个列表元素添加内容,同时会影响a列表中的元素
  9. >>> b[-1].append(3)
  10. >>> a
  11. [1, 2, [3]]
  12. >>> b
  13. [1, 2, [3]]
  • 切片是浅克隆
  1. >>> a = [1, []]
  2. >>> 此处是浅复制
  3. >>> b = a[:]
  4. >>> a is b
  5. False
  6. >>> a == b
  7. True
  8. >>> 改变b的同时也会影响a
  9. >>> b[-1].append(2)
  10. >>> a
  11. [1, [2]]
  12. >>> b
  13. [1, [2]]

深克隆

使用copy模块中的deepcopy方法可以实现深克隆,使用copy模块中的copy方法可以实现浅克隆.