浅拷贝

完整的拷贝所有信息 包裹内部对象的包含关系等

  1. >>> a = [1,2]
  2. >>> b = a #或 b = copy.copy(a)
  3. >>> b.append(3)
  4. >>> b
  5. [1, 2, 3]
  6. >>> a
  7. [1, 2, 3]

image.png

浅拷贝是拷贝引用(就是黄色箭头)
可以通过 id(a) == id(b)来查看

  1. >>> id(a)
  2. 4503060872
  3. >>> id(b)
  4. 4503060872

如果是赋值,那么他们的id是一样的
如果是copy.copy 那么他们的id不太,但是拷贝后的变量中的元素指向是相同的,但如果a是元组类型,那么id不变,因为元组是不可变类型。

  1. >>> a = [1,2]
  2. >>> b = [3,4]
  3. >>> c = [a,b]
  4. >>> d = copy.copy(c)
  5. >>> id(c)
  6. 4503060872
  7. >>> id(d)
  8. 4504400776
  9. >>> id(c[0])
  10. 4504274312
  11. >>> id(d[0])
  12. 4504274312

深拷贝

拷贝所有的值,形成一个全新的对象。

  1. >>> import copy
  2. >>> a = [1,2]
  3. >>> b = [3,4]
  4. >>> c = [a,b]
  5. >>> d = copy.copy(c)
  6. >>> e = copy.deepcopy(c)
  7. >>> e
  8. [[1, 2], [3, 4]]
  9. >>> id(c[0])
  10. 4504274312
  11. >>> id(e[0])
  12. 4504400840
  13. >>> a.append(666)
  14. >>> c
  15. [[1, 2, 666], [3, 4]]
  16. >>> d
  17. [[1, 2, 666], [3, 4]]
  18. >>> e
  19. [[1, 2], [3, 4]]