與IPython中玩的時候,我很驚訝地發現,給定一個列表支持一些方法x()
(即,比如說,打印出"Hi!"
)每個對象的f
,表達:在Python中,列表理解與列表和元組有什麼區別?
(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是剛剛建立包含有發電機的元組,而不是評估發生器,因爲它是在第二案件。
因此,是不是可以直接得到一個元組作爲生成列表理解的結果? (我明白我可以做tuple([y.x() for y in f])
)。我沒有用例,這純粹是爲了我的理解。
爲什麼是什麼?你已經發現了它的含義,即使它不是你最初的預期。你在問爲什麼生成器表達式存在?或者你問爲什麼這個語法不會生成元組(類似於列表理解)?或者是其他東西? – delnan
你在問爲什麼它是違反直覺的,或者爲什麼存在基因? –
如果它是違反直覺的,那意味着你期待其他一些行爲。你在期待什麼? – recursive