Python赋值、深拷贝与浅拷贝详解
199 浏览量
更新于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-12-20 上传
点击了解资源详情
weixin_38679233
- 粉丝: 2
- 资源: 872
最新资源
- 全国江河水系图层shp文件包下载
- 点云二值化测试数据集的详细解读
- JDiskCat:跨平台开源磁盘目录工具
- 加密FS模块:实现动态文件加密的Node.js包
- 宠物小精灵记忆配对游戏:强化你的命名记忆
- React入门教程:创建React应用与脚本使用指南
- Linux和Unix文件标记解决方案:贝岭的matlab代码
- Unity射击游戏UI套件:支持C#与多种屏幕布局
- MapboxGL Draw自定义模式:高效切割多边形方法
- C语言课程设计:计算机程序编辑语言的应用与优势
- 吴恩达课程手写实现Python优化器和网络模型
- PFT_2019项目:ft_printf测试器的新版测试规范
- MySQL数据库备份Shell脚本使用指南
- Ohbug扩展实现屏幕录像功能
- Ember CLI 插件:ember-cli-i18n-lazy-lookup 实现高效国际化
- Wireshark网络调试工具:中文支持的网口发包与分析