Python 3.7 文档提到“在用于实现理解和生成器yield表达式的隐式嵌套范围内”不推荐使用表达式,3.8 的删除待定:
由于它们对包含范围的副作用,yield 表达式不允许作为用于实现理解和生成器表达式的隐式定义范围的一部分(在 Python 3.7 中,此类表达式在编译时会发出 DeprecationWarning,在 Python 3.8+ 中它们将发出 SyntaxError) .
我试图了解这种变化会影响什么(中断?),因为乍一看它解决了一个相当深奥的场景。首先有一个yield在列表理解或生成器表达式中的充分理由吗?
到目前为止,我想出了这些(相当荒谬的)示例,这些示例在 Python 3.8 中应该是非法的:
>>> list((yield i) for i in range(5))
[0, None, 1, None, 2, None, 3, None, 4, None]
>>> list([(yield i) for i in range(5)])
[0, 1, 2, 3, 4]