Python赋值、深拷贝与浅拷贝详解
5 浏览量
更新于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中的直接赋值、浅拷贝和深拷贝对于编写涉及复杂数据结构的程序至关重要,因为它们直接影响到对象的生命周期和内存管理。正确地使用这些概念可以帮助避免意外的副作用,确保程序的行为符合预期。
132 浏览量
点击了解资源详情
119 浏览量
700 浏览量
1491 浏览量
1597 浏览量
263 浏览量
108 浏览量
188 浏览量
weixin_38679233
- 粉丝: 2
- 资源: 872
最新资源
- 关于sql优化.doc
- 服装行业电子商务平台建设构想.pdf
- JAVA解惑之详细介绍
- sql server 2000
- Java项目开发常见问题分析
- accp5.0s2三层+OOP测试
- css常用参数说明文档
- Websphere Appliction Server Development Best Practices for Performance and Scalability.pdf
- 高质量C++编程指南.pdf
- FastReport_3.0_设计手册PDF
- The_C_Programming_Language_2nd_edition
- Test Automation Frame--主要框架的介绍.doc
- tuxedo编程速成
- JBossWeb用户手册
- PHP5与MySQL5 Web开发技术详解.pdf
- 很好的linux学习笔记