Python编程:闭包、深浅拷贝、垃圾回收与with语句详解
148 浏览量
更新于2024-09-06
收藏 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语句是编写高效、健壮代码的关键。它们在日常编程中频繁出现,对于优化代码结构和性能具有重要作用。
121 浏览量
138 浏览量
178 浏览量
142 浏览量
2018-01-09 上传
207 浏览量
154 浏览量
738 浏览量
767 浏览量

weixin_38665804
- 粉丝: 11
最新资源
- MTG Scryer-crx插件:快速魔术聚会卡搜索工具
- 大华2卡密计算工具新版本上线,优化门禁电梯管理
- 深入解析Win7系统中的计算器功能
- VB源码实现AES加密解密程序演示
- XnView图片处理工具:转换与压缩功能详解
- 初学者适用的VxWorks BSP培训教材
- ARM架构MySQL库文件详解与版本说明
- C++实现笛卡尔、大地、站心坐标互转教程
- Chrome扩展FA Ad Banner Nuker:移除Furaffinity第三方广告
- CardView使用示例与相关库介绍
- 易语言实现时间同步功能的源码解析
- Cfront 3.0.3:体积小功能完备的C++编译器
- 探索海尔电视存储数据的秘密
- ARM架构下编译的boost库文件版本1.59测试可用
- 使用json-msg-react简化React中的表单验证流程
- 小舞易语言浏览器核心功能与多进程技术解析