10
たとえば、私は次のコードを持っている:d
後Python ioストリームはリスト内包で自動的に閉じられますか?
d = [l for l in open('a.txt', 'r')]
が作成され、リスト内包で開かれたストリームは自動的に閉じ得るのだろうか?
たとえば、私は次のコードを持っている:d
後Python ioストリームはリスト内包で自動的に閉じられますか?
d = [l for l in open('a.txt', 'r')]
が作成され、リスト内包で開かれたストリームは自動的に閉じ得るのだろうか?
"多分"。
refcountingを使用するcPythonでは、リスト内包が終了するとすぐにファイルが閉じられます(file
オブジェクトへのすべての参照が失われます)。
しかし、Python標準ではにはが必要です。たとえば、JVMガベージコレクタを使用するjythonでは、ファイルはすぐに閉じられません。このは保証ファイルが閉じてしまいますことを
with open(…) as f:
d = [l for l in f]
:
リソースが正しく閉じていることを保証する「好ましい」方法はwith
文です。
@astynaxが指摘しているように、ここではd = f.readlines()
を使用することができます。これは、リストの理解と同じセマンティクスを持つためです。 (CPythonの中で)自分自身にこれを証明するために
:
>>> class Foo(object): ... def __del__(self): ... print "in __del__" ... def __iter__(self): ... return iter([1, 2, 3, 4]) ... >>> [ x for x in Foo() ] in __del__ [1, 2, 3, 4]