Pythonのtuple内包表記の落とし穴
タイトルは釣りです。というかあると思ってたら落とし穴に引っかかりました。
以下のコードを実行すると……
t = (x for x in range(4)) for x in t: print x for x in t: print x
出力
0 1 2 3
二回目のfor文が実行されていません。なんでやねん。 なまじエラーの出力も無いものだから、結構気付くのが遅れました。
色々調べてみた結果わかりました。このt
はtupleじゃなくて ジェネレータ になっていたのです。
t = (x for x in range(4)) print t
出力
<generator object <genexpr> at 0x1012f0320>
つまり、最初の例で言うと、最初のfor文でジェネレータを消費しきっていたために 二回目のfor文では何も返されなかったのです。
tupleが欲しい場合は素直に
t = tuple([x for x in range(4)])
と書きましょう。