Python赋值、深拷贝与浅拷贝详解
17 浏览量
更新于2024-09-01
1
收藏 97KB PDF 举报
本文主要探讨了Python编程中的直接赋值、浅拷贝和深拷贝的概念,通过实例展示了它们在可变对象与不可变对象之间的差异,并解释了这些操作对对象标识符(id)和值的影响。
直接赋值在Python中,实际上是对象的引用,即给对象创建一个新的别名。当我们将一个变量赋值给另一个变量时,无论是对于可变对象(如列表)还是不可变对象(如整数或字符串),它们的id值都会相同,表明它们指向同一个内存位置。然而,对于不可变对象,即使通过新的别名修改值,也不会影响原始对象,因为不可变对象一旦创建,其值就不能改变,而是会创建一个新的对象并更新别名的绑定。例如:
```python
x = 1
y = x
id(x) == id(y) # True
y = y + 1
id(x) == id(y) # False
```
在上述代码中,`y = y + 1` 实际上是创建了一个新的整数对象并将其绑定到 `y`,而 `x` 仍然指向原来的整数对象。
对于可变对象,直接赋值的情况有所不同。如果修改赋值后的变量,原始变量的值也会改变,因为它们引用的是同一个对象。例如:
```python
m = [1, 2, 3]
n = m
id(n) == id(m) # True
n[0] = 4
n # [4, 2, 3]
m # [4, 2, 3]
id(n) == id(m) # True
```
在这个例子中,修改 `n` 的元素实际上会影响 `m`,因为它们共享相同的内存空间。
浅拷贝(shallow copy)只复制父对象,但不复制对象内的子对象。这意味着,如果父对象包含可变对象,那么修改副本的子对象会影响到原始对象。例如,如果我们有一个包含列表的列表,并进行浅拷贝:
```python
import copy
o = [[1, 2], [3, 4]]
p = copy.copy(o)
p[0][0] = 5
p # [[5, 2], [3, 4]]
o # [[5, 2], [3, 4]]
```
尽管我们只修改了浅拷贝 `p` 中的一个元素,但由于子列表是可变对象,所以原始对象 `o` 也被影响了。
深拷贝(deep copy)则会创建一个完全独立的对象,包括所有子对象。这样,修改深拷贝的对象不会影响原始对象。我们可以通过 `copy.deepcopy()` 函数实现深拷贝:
```python
import copy
o = [[1, 2], [3, 4]]
q = copy.deepcopy(o)
q[0][0] = 6
q # [[6, 2], [3, 4]]
o # [[1, 2], [3, 4]]
```
在这个例子中,由于进行了深拷贝,修改 `q` 的子列表不会影响到 `o`。
理解Python中的直接赋值、浅拷贝和深拷贝对于编写涉及复杂数据结构的程序至关重要,因为它们直接影响到对象的生命周期和内存管理。正确地使用这些概念可以帮助避免意外的副作用,确保程序的行为符合预期。
2020-12-31 上传
2020-09-17 上传
2020-12-25 上传
2020-12-17 上传
2020-12-25 上传
2021-12-29 上传
2020-09-21 上传
2020-09-17 上传
点击了解资源详情
weixin_38679233
- 粉丝: 2
- 资源: 872
最新资源
- SSM动力电池数据管理系统源码及数据库详解
- R语言桑基图绘制与SCI图输入文件代码分析
- Linux下Sakagari Hurricane翻译工作:cpktools的使用教程
- prettybench: 让 Go 基准测试结果更易读
- Python官方文档查询库,提升开发效率与时间节约
- 基于Django的Python就业系统毕设源码
- 高并发下的SpringBoot与Nginx+Redis会话共享解决方案
- 构建问答游戏:Node.js与Express.js实战教程
- MATLAB在旅行商问题中的应用与优化方法研究
- OMAPL138 DSP平台UPP接口编程实践
- 杰克逊维尔非营利地基工程的VMS项目介绍
- 宠物猫企业网站模板PHP源码下载
- 52简易计算器源码解析与下载指南
- 探索Node.js v6.2.1 - 事件驱动的高性能Web服务器环境
- 找回WinSCP密码的神器:winscppasswd工具介绍
- xctools:解析Xcode命令行工具输出的Ruby库