我在知乎上回答了一个关于 Python 浅拷贝和深拷贝的问题,转载于此,希望对大家有所帮助。

我们用一个比喻来解释 Python 中的深拷贝和浅拷贝

想象一下,你有一本书有好几章。 您想要创建本书的副本。

浅拷贝就像复印书的封面和目录,但保留原始章节。 在复制的书中,目录指向与原书相同的章节。 如果您对章节进行任何更改,它将影响原始书籍和复制的书籍,因为它们共享相同的内容。深拷贝就像复印整本书,包括它的所有章节。 现在,您有两本书,每本书都有自己的一组章节。 如果您对一本书中的章节进行任何更改,不会影响另一本书,因为它们具有完全独立的内容。

这个比喻不知道是否清楚。在这个比喻中,书代表数据结构,章节代表数据结构中的对象,目录代表对嵌套对象的引用。 浅拷贝在原始数据结构和复制的数据结构之间共享相同的“章节”(引用),而深拷贝为复制的数据结构创建新的“章节”(新引用),使其独立于原始数据结构。

下面我们用软件术语来看看什么是浅拷贝和深拷贝。

浅拷贝是指创建一个新对象,但不创建原始数据结构中嵌套对象的副本, 但它复制了对那些嵌套对象的引用, 这意味着如果嵌套对象是可变的(例如,列表、字典),对它们所做的更改将反映在原始数据结构和浅拷贝数据结构中,因为它们仍然指向相同的嵌套对象。

深拷贝是指创建一个新对象并递归复制原始数据结构中的所有嵌套对象。 这意味着复制的数据结构完全独立于原始数据结构,对一个数据结构中的嵌套对象所做的更改不会影响另一个数据结构。

下面是浅拷贝和深拷贝的示例。

浅拷贝示例:

# 浅拷贝示例

import copy

original_list = [[1, 2], [3, 4]]
shallow_copied_list = copy.copy(original_list)

shallow_copied_list[0][0] = 99

print(original_list)         # Output: [[99, 2], [3, 4]]
print(shallow_copied_list)   # Output: [[99, 2], [3, 4]]

深拷贝示例:

# 深拷贝示例

import copy

original_list = [[1, 2], [3, 4]]
deep_copied_list = copy.deepcopy(original_list)

deep_copied_list[0][0] = 99

print(original_list)         # Output: [[1, 2], [3, 4]]
print(deep_copied_list)      # Output: [[99, 2], [3, 4]]

通过以上的描述和示例可以看出:

  • 浅拷贝仅复制最外层的容器
  • 深拷贝不仅复制最外层的容器,还创建原始数据结构中所有嵌套对象的副本

相关博客文章

相关书籍教程文章
官方公众号

💯本站文章同步发表在官方公众号 ReadingHere,关注公众号您将在第一时间了解本站最新文章和资讯。

❤️欢迎您关注本站官方公众号 ReadingHere


版权声明

本文由ReadingHere原创,未经ReadingHere授权不得转载、摘编。已经授权使用的,应在授权范围内使用,并注明来源: www.readinghere.com。违反上述声明者,ReadingHere将追究其相关法律责任。


交流合作

如需交流咨询或商务合作请扫描下图微信二维码联系。