意外行为:列表推导式改变变量作用域
Python 列表推导式是强大的数据操作工具,但它们有一个隐藏的怪癖:可能会导致意外行为。
问题
在Python 2(及更早版本)中,列表推导式可以将循环控制变量“重新绑定”到循环的最后一个值,即使在推导式的范围结束之后也是如此。这可能会导致令人惊讶的行为:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
在此示例中,循环控制变量 x 被重新分配给列表理解中循环的最后一个值 (4)。这意味着当在推导式之外调用 print(x) 时,它会打印 4 而不是“原始值”。
解释
上述行为是结果列表推导式最初在 Python 2 中实现的方式。为了使列表推导式尽可能高效,循环控制变量被泄漏到周围
Python 3 修正
在 Python 3 中,此行为已更改。列表推导式不再在推导式之外重新绑定循环控制变量。这样做是为了提高列表推导式和生成器表达式之间的一致性,它们永远不会重新绑定循环控制变量。
Guido van Rossum 的解释
Guido van Rossum,创建者Python 的作者解释了 Python 3 中这一更改背后的原因:
“我们决定修复“脏”通过使用与生成器表达式相同的实现策略,可以实现列表推导式的“小秘密”。因此,在 Python 3 中,上面的示例...将打印“before”,证明列表推导式中的“x”暂时隐藏但不会覆盖周围范围内的“x”。”
结论
而 list 的行为推导式一开始可能看起来违反直觉,但了解它们在 Python 2 和 Python 3 中的工作原理非常重要。这些知识将帮助您避免潜在的错误并编写更健壮的代码。
以上是为什么我的 Python 列表理解会改变变量的值?的详细内容。更多信息请关注PHP中文网其他相关文章!