Python编程:闭包、深浅拷贝、垃圾回收与with语句详解
88 浏览量
更新于2024-09-07
收藏 96KB PDF 举报
"本文将深入探讨Python编程中的四个核心概念:闭包、深浅拷贝、垃圾回收和with语句,这些都是Python开发中不可或缺的知识点。"
1. 闭包
闭包是Python中一种特殊的函数特性,它涉及到函数内部的局部作用域和外部作用域之间的交互。闭包的基本构成包括:
1.1 闭包概念
当一个内部函数引用了外部函数的局部变量,并且外部函数返回这个内部函数的引用时,就形成了一个闭包。在闭包中,外部函数的局部变量不会随着外部函数的结束而立即释放,而是继续存在于内存中,供内部函数使用。
1.2 闭包特点
- 必须包含一个内嵌函数
- 内嵌函数必须引用外部函数的变量
- 外部函数的返回值是内嵌函数的引用
例如:
```python
def outer(a):
b = 10
def inner():
print(a + b)
return inner
if __name__ == '__main__':
demo = outer(5)
demo() # 输出 15
```
在这个例子中,`outer`函数返回了`inner`函数的引用,形成闭包。`outer`函数结束后,`a`和`b`并没有被释放,因为它们在`inner`函数中仍然被引用。
1.3 闭包中内函数修改外函数局部变量
在Python中,闭包内的函数可以修改外部函数的局部变量,但需要注意的是,Python的默认行为是只读取,不修改。可以通过以下方式实现修改:
- Python3: 使用`nonlocal`关键字声明变量
- Python2: 变量需为可变类型,如列表,通过列表的修改操作间接修改变量
```python
def outer(a):
b = 10
c = [a]
def inner():
nonlocal b, c # Python3中声明变量b和c为非局部变量
b += 1
c[0] += 1
return inner
if __name__ == '__main__':
demo = outer(5)
demo()
print(demo.__closure__[0].cell_contents, demo.__closure__[1].cell_contents) # 输出 6 6
```
2. 深浅拷贝
在Python中,对象的复制分为浅拷贝(shallow copy)和深拷贝(deep copy):
- 浅拷贝:创建一个新的对象,但只复制原对象的引用。对于非可变对象,如数字或字符串,浅拷贝与深拷贝无区别。对于可变对象(如列表、字典),浅拷贝只是复制引用,原对象和新对象指向同一块内存。
- 深拷贝:创建一个新的对象,并递归地复制原对象的所有内容,确保新对象与原对象完全独立。
```python
import copy
lst = [1, [2, 3], 4]
lst_copy_shallow = lst.copy()
lst_copy_deep = copy.deepcopy(lst)
lst[1][0] = 5 # 修改原列表的子列表
print(lst_copy_shallow) # 输出 [1, [5, 3], 4],浅拷贝受影响
print(lst_copy_deep) # 输出 [1, [2, 3], 4],深拷贝不受影响
```
3. 垃圾回收
Python的垃圾回收机制是自动的,负责回收不再使用的对象所占用的内存。当一个对象没有任何引用指向它时,Python的垃圾回收器会将其删除。Python使用引用计数和循环检测两种策略来确定何时进行垃圾回收。
4. with语句
with语句用于简化资源管理,如文件、数据库连接等。with语句可以确保资源在使用完毕后得到正确的关闭,即使在处理过程中发生异常。它通过上下文管理协议(context manager protocol)来实现。
```python
with open('file.txt', 'r') as f:
content = f.read()
# 文件在with语句块结束后自动关闭
```
在这个例子中,`f`在with语句块内可用,一旦退出with,文件会自动关闭,无需显式调用`f.close()`。
总结:理解并熟练掌握Python的闭包、深浅拷贝、垃圾回收和with语句是编写高效、健壮代码的关键。它们在日常编程中频繁出现,对于优化代码结构和性能具有重要作用。
2019-08-25 上传
2017-10-11 上传
点击了解资源详情
2021-10-02 上传
2018-01-09 上传
2023-03-31 上传
2024-01-18 上传
2021-04-19 上传
2018-08-11 上传
weixin_38665804
- 粉丝: 11
- 资源: 942
最新资源
- StarModAPI: StarMade 模组开发的Java API工具包
- PHP疫情上报管理系统开发与数据库实现详解
- 中秋节特献:明月祝福Flash动画素材
- Java GUI界面RPi-kee_Pilot:RPi-kee专用控制工具
- 电脑端APK信息提取工具APK Messenger功能介绍
- 探索矩阵连乘算法在C++中的应用
- Airflow教程:入门到工作流程创建
- MIP在Matlab中实现黑白图像处理的开源解决方案
- 图像切割感知分组框架:Matlab中的PG-framework实现
- 计算机科学中的经典算法与应用场景解析
- MiniZinc 编译器:高效解决离散优化问题
- MATLAB工具用于测量静态接触角的开源代码解析
- Python网络服务器项目合作指南
- 使用Matlab实现基础水族馆鱼类跟踪的代码解析
- vagga:基于Rust的用户空间容器化开发工具
- PPAP: 多语言支持的PHP邮政地址解析器项目