以下、自分用のメモです。
Pythonといえば、リスト内包表記。楽なので、ほいほい使いたいところなのですが
スクリプト書くときって往々にして、なんかデータが詰まっているファイルがあって
その中身をゴニョゴニョして、整形したり抽出したりすることが私の場合は多いのです。
で、その際当然ファイルをオープンする必要があるので
with open(....) as fp: xxx = [... for line in fp if ...]
みたいのをよく書きます。でもネットとか書籍のサンプルみると
xxx = [... for line in open(...) if ...]
ってやってらっしゃるのもよく見かけます。使い捨てのスクリプトとかだと
どうせすぐ処理も終わるし、プロセスが落ちるときにファイルも閉じられるだろうから
とくに問題ないだろうと思ってるのですが、メインはC#erなので、やっぱり using と同様な
with を書いておかないとちょっと不安な気持ちになる。。。
てことで、stackoverflow先生に聞いてみると
って情報を発見。(いつもお世話になっております。)
回答が分かりやすく記載されていて、結論としては
実行しているPythonの実装系に依る。
とのこと。CPythonでは、参照カウント方式のGCをメインに処理されているので
リスト内包表記でopenしたら、終わると誰も参照していないことになるので
その瞬間にクローズされるとのこと。処理系がことなる iron-python や jythonなどは
裏側の処理系(.NETやJava) のGCの仕組みに乗るので、それらの言語で実装しているときと
同様に、GCが必要になった際に開放されるとのこと。
まあ、気になるんだったら、ちゃんと with 書いて処理しておけって書いてありますね。
あと、Pythonのガベージコレクションの内情について詳しく説明してくれているサイトも発見。
メモメモ。
以下、参考にした情報です。
- python - will using list comprehension to read a file automagically call close() - Stack Overflow
- How does garbage collection in Python work? - Quora
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場