张芷铭的个人博客

浅拷贝与深拷贝

链接:5张图彻底理解Python中的浅拷贝与深拷贝 - 知乎 (zhihu.com)

浅拷贝(shallow copy)与深拷贝(deep copy)在处理复杂对象(如包含其他对象的对象)时的行为有明显区别。理解这两者的差异,特别是在关于存储位置和对象引用的上下文中,对于正确应用它们非常重要。

浅拷贝

  • 创建一个新对象,其内容是原对象内容的引用(对于非容器类型的元素,其实是值的拷贝)。
  • 如果原对象包含的是引用(如列表中的列表),浅拷贝不会创建被引用对象的拷贝,而是简单地复制引用,因此新对象和原对象中的相应元素实际上引用同一个对象。
  • 对于简单的列表(列表中只包含不可变类型,如整数、字符串等),浅拷贝会创建一个新的列表对象,列表内容是原列表内容的引用(对于这些不可变类型来说,可以认为是值的拷贝),因此修改新列表不会影响原列表。

深拷贝

  • 创建一个新对象,然后递归地复制原对象中包含的所有对象。
  • 深拷贝会创建原对象中所有容器类型元素的副本,以及容器中的元素的副本,以此类推。这意味着完全复制了整个对象结构,新对象和原对象完全独立。
  • 使用深拷贝,修改新对象不会以任何方式影响原对象。

存储位置

  • 浅拷贝创建的新对象本身在内存中有自己的独立位置,但对于容器中的可变对象(如列表中的列表),浅拷贝只是复制了引用,因此新列表和原列表中的子列表仍然指向同一块内存地址。
  • 深拷贝创建的新对象以及对象内部所有的元素(无论是容器还是容器内的元素)都在内存中有自己的独立位置,与原对象完全分开。

💬 评论