
Python提供了两种复制对象的方式:深拷贝和浅拷贝。深拷贝会创建一个全新的、独立的对象副本,并包括其内部所有对象。而浅拷贝则会创建一个新的对象,但其内容是指向原始对象内容的引用。这一区别可能会影响一个对象的更改如何影响另一个对象。
在本篇博客文章中,我们将深入探讨Python中的深拷贝和浅拷贝,使用诸如list、dict、str、int等对象。我们将通过实际示例比较这两种拷贝方式,强调了解这些概念对于健壮编码实践的重要性。
copy模块Python提供了copy模块,该模块包含deepcopy方法来创建对象的深拷贝。
import copy
original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[1][0] = 'changed'
print(original_list)  # 输出: [1, [2, 3], [4, 5]]上述代码片段演示了使用deepcopy方法创建深拷贝。对deep_copied_list的更改不会影响original_list。
copy方法可以使用copy模块的copy方法或使用对象的内建复制功能来创建浅拷贝。
import copy
original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = copy.copy(original_dict)
shallow_copied_dict['a'][0] = 'changed'
print(original_dict)  # 输出: {'a': ['changed', 2], 'b': [3, 4]}此代码片段强调了对shallow_copied_dict的更改会反映在original_dict中,因为浅拷贝包含对原始对象内容的引用。
在Python中,可对不同类型的对象(如列表、字典、字符串和整数)执行深拷贝和浅拷贝。这些复制方法的行为在Mutable和Immutable类型之间有所不同。以下是详细分解:
import copy
original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)original_list = [1, [2, 3], [4, 5]]
shallow_copied_list = original_list.copy()
shallow_copied_list[1][0] = 'changed'
print(original_list)  # 输出: [1, ['changed', 3], [4, 5]]对于列表,深拷贝创建了一个完全独立的副本,而浅拷贝会导致嵌套对象的共享引用。
import copy
original_dict = {'a': [1, 2], 'b': [3, 4]}
deep_copied_dict = copy.deepcopy(original_dict)original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = original_dict.copy()
shallow_copied_dict['a'][0] = 'changed'
print(original_dict)  # 输出: {'a': ['changed', 2], 'b': [3, 4]}对于字典,深拷贝创建了全新的对象,而浅拷贝会导致嵌套对象的引用。
original_str = "text"
deep_copied_str = copy.deepcopy(original_str)
original_int = 42
deep_copied_int = copy.deepcopy(original_int)original_str = "text"
shallow_copied_str = copy.copy(original_str)
original_int = 42
shallow_copied_int = copy.copy(original_int)字符串和整数是不可变的,这意味着浅拷贝和深拷贝的行为相同,创建全新的对象。
| 对象类型 | 深
拷贝 | 浅拷贝 | Mutable / Immutable | |--------------|-----------------------------|----------------------------|---------------------| | List | 创建独立副本 | 对嵌套对象的引用共享 | Mutable | | Dictionary | 创建独立副本 | 对嵌套对象的引用共享 | Mutable | | String | 创建独立副本 | 创建独立副本 | Immutable | | Integer | 创建独立副本 | 创建独立副本 | Immutable |
了解如何与Python中的不同类型对象进行复制对于有效处理复杂数据结构至关重要。它提供了对对象如何复制和引用的控制,使代码更准确、更高效。
理解深拷贝和浅拷贝之间的差异对于在Python中操纵复杂数据结构至关重要。它允许对对象的复制和引用进行精确控制,使编码实践更加精简和高效。
copy模块中的deepcopy方法来创建深拷贝。| [Python] 通过多种示例深入了解位运算符 | 
|---|
| [Python] 通过多种示例深入了解关系运算符 | 
| [Python] 解决 'zsh: command not found: python' 错误的方法 | 
| [Python] 通过多种示例深入了解赋值运算符 | 
| [Python] 通过多种示例深入了解算术运算符 | 

CloneCoding
创新从一行代码开始!
![[JavaScript] 使用html2canvas下载网页截图的方法](https://img.clonecoding.com/thumb/101/16x9/320/javascript-使用html2canvas下载网页截图的方法.webp) 学习如何使用html2canvas库下载网页截图。深入了解其特点、优势、安装、使用方法以及注意事项。
学习如何使用html2canvas库下载网页截图。深入了解其特点、优势、安装、使用方法以及注意事项。![[CSS] 暗黑模式的实现 - 基于系统配置和用户选择的模式切换](https://img.clonecoding.com/thumb/100/16x9/320/css-暗黑模式的实现-基于系统配置和用户选择的模式切换.webp) 探索如何在您的网页上实现暗黑模式。了解如何利用系统设置和用户选择来有效地进行暗黑模式转换。
探索如何在您的网页上实现暗黑模式。了解如何利用系统设置和用户选择来有效地进行暗黑模式转换。![[Next.js] 何时使用 SSR、SSG 与 CSR - 探讨适当的应用场景](https://img.clonecoding.com/thumb/99/16x9/320/next-js-何时使用-ssr-ssg-与-csr-探讨适当的应用场景.webp) 在 Next.js 中,我们详细解析了哪种渲染方式,是 SSR、SSG 还是 CSR,更适合各种网站类型。
在 Next.js 中,我们详细解析了哪种渲染方式,是 SSR、SSG 还是 CSR,更适合各种网站类型。![[CSS] 虚拟选择器(Pseudo selector) 完美指南 - 必知的样式技巧](https://img.clonecoding.com/thumb/98/16x9/320/css-虚拟选择器-pseudo-selector-完美指南-必知的样式技巧.webp) 深入探讨CSS的虚拟选择器(Pseudo selector)。学习:first-child、:last-child、:nth-child(n)等,并探索实用的应用实例。
深入探讨CSS的虚拟选择器(Pseudo selector)。学习:first-child、:last-child、:nth-child(n)等,并探索实用的应用实例。![[Next.js] 三种渲染方式 - SSR、CSR、SSG:优缺点分析](https://img.clonecoding.com/thumb/97/16x9/320/next-js-三种渲染方式-ssr-csr-ssg-优缺点分析.webp) 深入探讨 Next.js 中的三种渲染方式:服务器端渲染(SSR)、客户端渲染(CSR)以及静态网站生成(SSG),了解其运作方式、优点和缺点。
深入探讨 Next.js 中的三种渲染方式:服务器端渲染(SSR)、客户端渲染(CSR)以及静态网站生成(SSG),了解其运作方式、优点和缺点。