Python编程:闭包、深浅拷贝、垃圾回收与with语句详解
PDF格式 | 96KB |
更新于2024-09-07
| 44 浏览量 | 举报
"本文将深入探讨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语句是编写高效、健壮代码的关键。它们在日常编程中频繁出现,对于优化代码结构和性能具有重要作用。
相关推荐










weixin_38665804
- 粉丝: 11
最新资源
- iBatis 2.0 开发指南:快速上手与高级特性
- Linux USB内核学习笔记
- J2EE电商系统入门精通:Struts+Hibernate实战教程
- JUnit测试框架:简化Java开发的利器
- 使用Struts2构建Web 2.0项目的实战指南
- 软件开发笔试试题解析与解答
- SWT图形用户界面教程:Java GUI开发
- 华为面试题解析:JAVA面试焦点
- Cisco路由器密码恢复步骤详解
- 面向对象分析与设计实战指南
- Quest Software's TOAD for Oracle 演示与介绍
- 《Struts in Action》中文版详解:Java Web框架深度解析
- 软件工程模式与项目管理探讨
- UML设计与软件工程实践:案例分析与工具详解
- 面向对象技术与UML方法:软件工程访谈与实践
- Core J2EE模式:最佳实践与设计策略