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

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

只是出于好奇心,这是如何工作的?我注意到该文件不包括一个 __del__ 方法。

有帮助吗?

解决方案

至少在cpython中,当文件对象被交易时,文件关闭。看到 file_dealloc 功能在 Objects/fileobject.c 在Cpython来源。 DealLoc方法有点像 __del__ 对于C类型,除非没有任何固有的问题 __del__.

其他提示

因此 陈述。

对于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还使用参考计数和确定性破坏。如果不再对对象引用,则立即释放对象。发布文件将关闭。

这与仅有非确定垃圾收集的EG Java不同。这意味着您会知道何时发布对象,因此您必须手动关闭文件。

请注意,参考计数并不完美。您可以拥有带有圆形引用的对象,这是从progam到达的。这就是为什么Python除参考计数外还具有垃圾收集的原因。

最好的猜测是,由于文件类型是内置类型,因此解释器本身可以处理垃圾集合中的文件。

另外,您仅在Python解释器退出后才检查,并且所有“泄漏”的文件手柄均已关闭。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top