copy模块


01.当对象被复制时,根据复制的方式的不同可分为赋值,浅拷贝和深拷贝:

  • 赋值,即使用”=”等于号复制,复制的对象具有原对象完全一致的内存引用。
    • 当被复制的对象为可变类型时,修改任意对象的内容都会对另一个对象进行修改。
    • 当被复制的对象为不可变类型时,修改对象的内容不会影响到另一个对象。
  • 浅拷贝(影子拷贝),使用copy()复制。
    • 当被拷贝的对象中没有嵌套其他可变类型时(比如列表嵌套列表),会复制元素并引用不同的内存地址。
    • 当被拷贝的对象中嵌套了其他可变类型时,该嵌套对象的会引用同一个内存地址,比如:
      list_A = [1, 2, 3, [4,5]]
      list_B = list_A.copy()
      print(id(list_A), id(list_B))
      print(id(list_A[3]), id(list_B[3]))
      • list_A[3]与list_B[3]的内存地址一致,修改其内容会同时修改2边的内容。
  • 深拷贝,使用copy.deepcopy()复制。
    • 会迭代复制被拷贝对象中的每一个元素到新的对象中,并且确保每个元素引用不同的内存地址,比如:
      import copy
      list_A = [1, 2, 3, [4,5]]
      list_B = copy.deepcopy(list_A)
      print(id(list_A), id(list_B))
      print(id(list_A[3]), id(list_B[3]))
      • list_A[3]与list_B[3]的内存地址不一致,修改其内容不会影响另一个对象。
文档更新时间: 2021-02-21 21:43   作者:闻骏