这篇文章是关于术语“浅拷贝”和“深拷贝”的正确用法,特别是在谈论复制不包含任何引用的对象时。这个问题并不意味着(也不应该)基于意见,除非确实就这个话题没有达成共识。我已将这个问题标记为 C,但它可能与语言无关,除非这些术语在该上下文中的含义对于特定语言有明确定义,但对于其他语言没有明确定义。
术语“浅拷贝”和“深拷贝”在复制带有引用的对象时常用,以指定副本是否完整(独立于原始对象)。
但是,我也看到在没有引用的情况下复制对象时使用的这个术语,这两个术语的意思完全相同,不需要区分。到目前为止,我还没有找到一个简明的定义来涵盖这些术语的这种特殊用法。
Stack Overflow 上给出的定义(在标签浅拷贝和深拷贝中):
浅拷贝包含指向原始变量的链接(内存中的地址)。浅拷贝的变化反映在原始对象上。
深拷贝复制指向的对象或变量,以便目标(被分配的对象)接收其自己的本地副本。
在这些定义下,没有引用的对象副本将是深度副本。
维基百科上给出的定义(在文章对象复制中):
复制对象的一种方法是浅拷贝。在这种情况下,会创建一个新对象 B,并将 A 的字段值复制到 B。这也称为逐字段复制、逐字段复制或字段复制。如果字段值是对对象的引用(例如,内存地址),则它复制该引用,因此引用与 A 相同的对象,如果字段值是原始类型,则它复制原始类型的值。在没有原始类型的语言(其中一切都是对象)中,副本 B 的所有字段都是对与原始 A 的字段相同的对象的引用。因此被引用的对象是共享的,因此如果这些对象之一被修改(从 A或 B),变化在另一个中是可见的。浅拷贝很简单而且通常很便宜,因为它们通常可以通过简单地精确复制位来实现。
另一种方法是深拷贝,这意味着字段被取消引用:不是对正在复制的对象的引用,而是为任何被引用的对象创建新的副本对象,并将对这些对象的引用放置在 B 中。结果与浅拷贝给出的结果不同因为副本 B 引用的对象与 A 引用的对象不同,并且是独立的。由于需要创建额外的对象,深拷贝更昂贵,并且由于引用可能形成复杂的图,因此可能更加复杂。
在这些定义下,没有引用的对象副本将是浅拷贝。
我认为这两个术语都不合适,因为“浅拷贝”意味着复制不完整,而“深拷贝”意味着复制需要某种特殊处理(或高成本)。由于复制一个没有引用的对象既完整又不需要任何特殊处理,我认为这两个术语都不应该使用。然而,这篇文章不是关于我的想法,而是编程社区当前的共识(如果有的话)。
当我复制一个没有引用的对象时,是否会被考虑
部分深拷贝是否有一个好的术语,其中一些字段是浅拷贝而其他字段是深拷贝?