8

あなたが持っているとしましょう:

def my_func():
    fh = open(...)
    try:
        print fh.read()
    finally:
        fh.close()

私の最初の質問は、try/finally (または with) ステートメントを使用する価値はありますか? 関数が(ガベージコレクションを介して)終了すると、とにかくファイルは閉じられませんか?

Martelliの「python cookbook」のレシピを読んだ後、私はこれに出くわしました

all_the_text = open('thefile.txt').read()

「そうすると、読み取り操作が終了するとすぐに、ファイル オブジェクトへの参照がなくなります。実際には、Python はすぐに参照の欠如に気づき、すぐにファイルを閉じます。」

私の関数の例はほとんど同じです。参照はありますが、参照の寿命が非常に短いというだけです。

2 番目の質問は、Martelli の声明の「すぐに」とはどういう意味ですか? 参照がまったくない場合でも、ファイルのクローズはガベージ コレクション時に発生しませんか?

4

1 に答える 1

12

自分でファイルを閉じることをお勧めします。このwithステートメントを使用すると、コードがきれいになり、ファイルが自動的に閉じられます (これは良いことです)。

Python は高水準のプログラミング言語ですが、それでも自分が行っていることを制御する必要があります。経験則として、ファイルを開く場合は、閉じる必要もあります。コードをずさんにする正当な理由はありません :-)

2 番目の質問について: すぐには実行されません。ガベージ コレクターが実行する時間であると判断したときに実行されます。ファイル オブジェクトの割り当てが解除されると、Python はファイルを閉じます。Python でのガベージ コレクションに関するいくつかの 記事を次に示します (gcモジュールも参照してください)。これは興味深い読み物です。

また、Python のガベージ コレクションは、ガベージ コレクションを決定する前に、割り当てられたオブジェクトと割り当て解除されたオブジェクトの数に基づくしきい値を使用することも示しています。ファイルが大きい場合、ガベージ コレクション コードがまだ実行されていない可能性があるため、Python は必要以上に長くファイルを開いたままにする可能性があります。

于 2012-07-10T08:27:20.400 に答える