10

たとえば、次のコードがあります。

d = [l for l in open('a.txt', 'r')]

が作成された後d、リスト内包表記で開かれたストリームは自動的に閉じられますか?

4

1 に答える 1

18

"多分"。

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]
于 2012-06-14T05:55:16.677 に答える