列表解析和生成器解析中带有 `yield` 有什么区别?两者都返回生成器对象(分别为 `listcomp` 和 `genexpr`),但在完全求值后,后者会添加似乎相当多余的 `None`。
区别在于列表解析一次性地构建一个列表对象,而生成器解析则是按需逐个生成元素。因此,即使以相同方式编写,生成器解析中的 `yield` 最终也会返回 `None`。
区别在于列表解析一次性地构建一个列表对象,而生成器解析则是按需逐个生成元素。因此,即使以相同方式编写,生成器解析中的 `yield` 最终也会返回 `None`。
>>> list([(yield from a) for a in zip("abcde", itertools.cycle("12"))])
['a', '1', 'b', '2', 'c', '1', 'd', '2', 'e', '1']
>>> list(((yield from a) for a in zip("abcde", itertools.cycle("12"))))
['a', '1', None, 'b', '2', None, 'c', '1', None, 'd', '2', None, 'e', '1', None]
怎么会这样?有什么科学解释吗?
yield from
Python语句的行为。链接的“重复”答案询问有关yield
Python语句的类似问题。这两个语句是不同的。由于yield from
最近才添加到语言中,因此它产生的新意外行为是非常自然的。这应该导致一些问题,虽然它们看起来与关于yield
的问题相似,但并不是关于yield
的相同问题。 - Dmitry Rubanovichyield from a
引起。 - MisterMiyagi