15

ファイルを閉じずに開いた場合、ファイルがリークすることを常に想定していましたが、次のコード行を入力すると、ファイルが閉じられることを確認しました。

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

純粋な好奇心から、これはどのように機能するのでしょうか? __ファイルにdel__メソッドが含まれていないことに気付きました。

4

4 に答える 4

20

少なくとも CPython では、ファイル オブジェクトの割り当てが解除されると、ファイルは閉じられます。CPython ソースのfile_dealloc関数を参照してください。Objects/fileobject.c割り当て解除メソッドは__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 に答える