15

我一直认为如果打开而不关闭文件会泄漏,但我只是验证了如果输入以下代码行,文件将关闭:

>>> f = open('somefile.txt')
>>> del f

纯粹出于好奇,这是如何工作的?我注意到该文件不包含__del__方法。

4

4 回答 4

20

至少在 CPython 中,文件对象在释放时会关闭。请参阅CPython 源代码中的file_dealloc函数。Objects/fileobject.cDealloc 方法有点像__del__C 类型,除了没有__del__.

于 2009-02-22T17:53:46.667 回答
4

因此使用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.
于 2009-02-22T17:35:00.923 回答
2

除了垃圾收集之外,Python 还使用引用计数和确定性销毁。当不再有对某个对象的引用时,立即释放该对象。释放文件会关闭它。

这与只有非确定性垃圾收集的 Java 不同。这意味着您不知道对象何时被释放,因此您必须手动关闭文件。

请注意,引用计数并不完美。您可以拥有带有循环引用的对象,这是程序无法访问的。这就是 Python 除了引用计数之外还有垃圾收集的原因。

于 2009-02-22T18:22:23.773 回答
0

最好的猜测是,因为文件类型是内置类型,解释器本身会在垃圾收集时处理关闭文件。

或者,您只在 python 解释器退出后进行检查,并且所有“泄露”的文件句柄都已关闭。

于 2009-02-22T17:41:07.743 回答