Skip to content

Latest commit

 

History

History
136 lines (98 loc) · 3.23 KB

098-763913-[专业选修]列表_深拷贝_deepcopy.sy.md

File metadata and controls

136 lines (98 loc) · 3.23 KB
show version enable_checker
step
1.0
true

列表 - 深拷贝 deepcopy

回忆

  • 赋值的时候注意有两种情况
    • =
      • 直接复制变量引用的地址
    • 拷贝
      • 新建列表
      • 复制列表项的引用地址
      • 但如果列表项是列表
        • 就原样复制列表地址
        • 一改全改

图片描述

  • 可以做一个真正互不影响的副本吗?
    • 无论列表维度如何
    • 都不互相影响

查看文档

  • help(list.copy)

图片描述

  • 目前的拷贝是一种shallow copy
    • 浅浅的拷贝
    • 只复制列表项具体引用的地址
    • 而不为新的容器重新申请新的内存空间
  • 除了浅拷贝之外可以有深拷贝吗?

深拷贝

  • 搜索

图片描述

  • 就点第一个
  • 比较了=、浅拷贝、深拷贝(deepcopy)
    • = 直接把地址给赋过去
    • 浅拷贝
      • 把原列表里面列表项的引用都拷贝出来
        • 做成新的 list 赋过去
      • 多维列表会导致引用到同一个地址空间
        • 一概全改
    • 深拷贝
      • 彻底复制地址里面指向的每一个东西
      • 彻底重新分配内存地址空间
      • 彻底制作一个真正新的副本
      • 副本和原本彼此互不影响
  • 观察试试深拷贝

比较

图片描述

具体操作

  • 有深浅变化才有意思啊
    • 不同的拷贝类型
import copy
l1 = [["oeasy",[165,70]],["o2z",[170,100]]]
l2 = copy.deepcopy(l1)
l1[0][1][0] = 150

图片描述

  • 要知深浅
  • 更高维度的列表深拷贝也能完全制作副本吗?

更高维度的列表

  • 这维度明显上去了

图片描述

  • 这么深的层次的话
  • 深拷贝都能一层层复制出来么?

深拷贝的威力

图片描述

  • 深拷贝确实很深
  • 所有相应的位置引用的地址都不相同!
  • 避免浅尝辄止
  • 需要深耕

深浅拷贝总结

  • 等号赋值的意思是

    • 把对象地址直接传给另一个对象
  • 浅拷贝的意思是

    • 目标列表拥有自己的独立地址
    • 目标列表的列表项也有独立地址
    • 但是目标列表的列表项引用的还是原来的地址
  • 深拷贝的意思是

    • 完全为各个层级被复制的元素新申请空间
    • 整个列表是新空间中的
    • 和原来的列表彻底断绝引用的关系

总结

  • 赋值的时候注意有三种情况
    • =
      • 直接复制变量引用的地址
    • 浅拷贝
      • 新建列表
      • 复制列表项的引用地址
    • 深拷贝
      • 新申请空间
      • 彻底做一个新的副本
      • 把所有东西都复制出来
      • 这就是深拷贝所谓深的地方

图片描述

  • 列表三种复制方法我们清楚了
  • 如果是多维列表的运算呢?
  • 内存中的样子是如何的呢?🤔
  • 下次再说 👋