面试题答案
一键面试常见场景
- 循环引用:对象之间相互引用,垃圾回收器无法自动回收。例如,两个类A和B,A类实例引用B类实例,B类实例又引用A类实例。
- 未关闭文件或数据库连接:在处理大数据时,持续打开文件或数据库连接,占用内存资源且未释放。
- 大列表或大字典的不当使用:不断向列表或字典中添加元素,而没有及时清理不需要的数据,导致内存持续增长。
解决办法
- 针对循环引用:使用
weakref
模块,它提供了弱引用机制,允许在对象之间创建不影响垃圾回收的引用。 - 针对未关闭文件或数据库连接:使用
with
语句来管理文件和数据库连接,确保在使用完毕后自动关闭。例如处理文件:
with open('data.txt', 'r') as f:
data = f.read()
对于数据库连接(以sqlite3为例):
import sqlite3
with sqlite3.connect('test.db') as conn:
cursor = conn.cursor()
cursor.execute('SELECT * FROM table')
results = cursor.fetchall()
- 针对大列表或大字典的不当使用:定期清理不再使用的元素,或者使用生成器来逐块处理数据,避免一次性加载大量数据到内存。例如:
def data_generator():
for i in range(1000000):
yield i
for num in data_generator():
# 处理数据
pass