Python列表理解覆盖值

标签 python closures list-comprehension

看看下面这段代码,它显示了一个列表理解..

>>> i = 6
>>> s = [i * i for i in range(100)]
>>> print(i)

当您在 Python 2.6 中执行代码示例时,它会打印 99,但是当您在 Python 3.x 中执行它时,它会打印 <强>6。

改变行为的原因是什么?为什么 Python 3.x 中的输出为 6

提前谢谢你!

最佳答案

旧的行为是一个错误,但由于某些代码依赖于它,因此无法轻易修复。

列表推导式中的变量i 应该是不同于顶层的i。从逻辑上讲,它应该有自己的范围,它不会扩展到理解之外,因为它的值只有在理解内部才有意义。但是在 Python 2.x 中,由于实现细节的原因,作用域超出了必要的范围,导致变量“泄漏”到外部作用域中,从而导致您看到令人困惑的结果。

Python 3.0 故意不打算向后兼容以前的版本,因此他们借此机会修复了这种不良行为。

In Python 2.3 and later releases, a list comprehension “leaks” the control variables of each for it contains into the containing scope. However, this behavior is deprecated, and relying on it will not work in Python 3.0

Source

关于Python列表理解覆盖值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4575698/

相关文章:

c++ - 将 Boost.Python 与 Visual Studio 8 集成

javascript - 函数组合和偏应用的直观思考方式

javascript - 如何在 1-arg javascript 函数中使用 2 个参数?

python - 在列表理解中处理 lambda 表达式中的元组

Haskell 函数检查数字是否为奇数,而不使用 odd 函数

python - 为什么列表理解可以比 Python 中的 map() 更快?

python - 使用 sqlalchemy 时出现溢出错误

python - 如何将列表变量传递给 Python 中的 subprocess.call 命令

python - 为什么 redis-py 没有地理扩展?

functional-programming - 如何在闭包中获取多个参数并打印它们?