1.直接拷贝

变量: 是对象的引用或者是指向对象的指针
对象:是被分配的一块内存,存储其值
image.png
如下可见,变量a引用int对象3,,变量a直接赋值给变量b,变量a和变量b都是指向同一个内存地址

  1. a = 3
  2. b = a
  3. print(id(a), id(b))
  4. ---------------------
  5. #140704918502528 140704918502528

2.浅拷贝

没有拷贝子对象,所以原始数据改变,子对象会改变

3.深拷贝

包含对象里面的子对象的拷贝,原始数据改变不会改变任何子元素

  1. a = [1, 2, 3, ["a", "b"]]
  2. print("原列表:{}".format(a))
  3. b = a
  4. c = a.copy()
  5. d = copy.deepcopy(a)
  6. a.append(22)
  7. a[3].append("last")
  8. print("直接赋值列表: {}".format(b))
  9. print("浅拷贝列表:{}".format(c))
  10. print("深拷贝列表:{}".format(d))
  11. ---------------------------------------
  12. #原列表:[1, 2, 3, ['a', 'b']]
  13. #直接赋值列表: [1, 2, 3, ['a', 'b', 'last'], 22]
  14. #浅拷贝列表:[1, 2, 3, ['a', 'b', 'last']]
  15. #深拷贝列表:[1, 2, 3, ['a', 'b']]

总结:

  1. 浅拷贝会将对象复制生成一个新对象,但新对象仍然存储原始对象的引用,当原始对象是可变对象,然后修改它的值时,新旧对象会同时改变。
  2. 深拷贝不仅会将对象复制生成一个新对象,且所有原始对象都会复制生成新对象,即使原始对象是可变对象,新对象存储的对象引用也是新的,所以改变旧对象的可变对象时,不会影响新对象。