我一直认为如果打开而不关闭文件会泄漏,但我只是验证了如果输入以下代码行,文件将关闭:
>>> f = open('somefile.txt')
>>> del f
纯粹出于好奇,这是如何工作的?我注意到该文件不包含__
del__
方法。
我一直认为如果打开而不关闭文件会泄漏,但我只是验证了如果输入以下代码行,文件将关闭:
>>> f = open('somefile.txt')
>>> del f
纯粹出于好奇,这是如何工作的?我注意到该文件不包含__
del__
方法。
至少在 CPython 中,文件对象在释放时会关闭。请参阅CPython 源代码中的file_dealloc
函数。Objects/fileobject.c
Dealloc 方法有点像__del__
C 类型,除了没有__del__
.
因此使用with语句。
对于 Python 2.5,使用
from __future__ import with_statement
(对于 Python 2.6 或 3.x,什么都不做)
with open( "someFile", "rU" ) as aFile:
# process the file
pass
# At this point, the file was closed by the with statement.
# Bonus, it's also out of scope of the with statement,
# and eligible for GC.
除了垃圾收集之外,Python 还使用引用计数和确定性销毁。当不再有对某个对象的引用时,立即释放该对象。释放文件会关闭它。
这与只有非确定性垃圾收集的 Java 不同。这意味着您不知道对象何时被释放,因此您必须手动关闭文件。
请注意,引用计数并不完美。您可以拥有带有循环引用的对象,这是程序无法访问的。这就是 Python 除了引用计数之外还有垃圾收集的原因。
最好的猜测是,因为文件类型是内置类型,解释器本身会在垃圾收集时处理关闭文件。
或者,您只在 python 解释器退出后进行检查,并且所有“泄露”的文件句柄都已关闭。