我在知乎上回答了一个关于 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]]
通过以上的描述和示例可以看出:
- 浅拷贝仅复制最外层的容器
- 深拷贝不仅复制最外层的容器,还创建原始数据结构中所有嵌套对象的副本
相关博客文章
- Python + Diagrams: 用代码输出高档系统架构图
- Python + Pandas : 轻松搞定CSV文件
- Python + PyAutoGUI: 轻松实现用户界面自动化
- Python + Cryptography : 给你的数据加把锁
- 用 Python 制作 ASCII 字符画
- Python 字典 (Dictionary) 入门
- 从串联到 F-字符串:释放 Python 字符串格式化的力量
- 神奇的 Python 元类 (metaclass) 及其应用
- Python 之禅
- 使用 Python 生成 Lorem lpsum 拉丁文本
相关书籍教程文章