玩弄 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 只是构建一个包含生成器的元组,而不是像在第二种情况下那样评估生成器。
那么,作为生成列表推导的结果,不能直接获取元组是真的吗?(我知道我能做到tuple([y.x() for y in f])
)。我没有用例,这纯粹是为了我的理解。