列表推导式:令人困惑的作用域来源
Python 2 中列表推导式的一个特殊方面是它们与变量作用域的不寻常交互。具体来说,列表推导式的循环控制变量“泄漏”到周围的作用域中,从而导致潜在的错误和混乱。
考虑以下代码:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
在 Python 2 中,此代码代码会意外地打印 4 而不是“原始值”。这是因为列表推导式中使用的循环控制变量 x 暂时遮蔽了推导式外部定义的 x。即使在理解完成后,这种阴影仍然存在。
这种行为可能是令人沮丧的重要根源,因为它可能会引入微妙且难以调试的错误。此外,它破坏了通常与列表推导相关的便利性和简单性。
但是,在 Python 3 中,这种行为已得到解决。列表推导式不再将循环控制变量泄漏到周围的作用域中。这使它们与生成器表达式保持一致,生成器表达式一直以这种方式运行。
根据 Python 的创建者 Guido van Rossum 的说法,列表推导式最初的泄漏实现是为了优化而做出的“故意妥协”他们的表现。然而,在 Python 3 中,由于性能的改进,这种妥协被认为是不必要的。
Python 3 中这种泄漏行为的消除极大地提高了列表推导式的可靠性和一致性。通过消除意外变量阴影的可能性,程序员现在可以更有信心地使用它们。
以上是为什么 Python 2 的列表理解范围与 Python 3 不同?的详细内容。更多信息请关注PHP中文网其他相关文章!