iPython をいじってみると、驚いたことに、f
それぞれが何らかのメソッドをサポートしているオブジェクトのリストx()
(つまり、 を出力する"Hi!"
) が次の式であることがわかりました。
(y.x() for y in f)
意味的に同等ではない
[y.x() for y in f]
最初のもの (出力としてタプルを使用) は、反復しない限り評価されないジェネレーター式になりますが、リストを使用するものは、実際には生成がすぐに行われます。
In [30]: (y.x() for y in f)
Out[30]: <generator object <genexpr> at 0x2d78d70>
しかし
In [31]: [y.x() for y in f]
Hi!
Hi!
Hi!
Hi!
これはかなり直感に反するようです。
質問: 最初の式が、リストの作成方法でジェネレーターから取得した値のタプルを生成しないのはなぜですか?
更新:これをさらに見つめると、おそらく最初のケースで起こっていることは、Pythonが2番目のケースのようにジェネレーターを評価するのではなく、ジェネレーターを含むタプルを構築しているだけであることに気付きました。
では、リスト内包表記を生成した結果としてタプルを直接取得することはできないというのは本当ですか? (私ができることを理解していますtuple([y.x() for y in f])
)。ユースケースはありません。これは純粋に私の理解のためです。