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