Python列表理解重写valu

2024-05-08 01:27:41 发布

您现在位置:Python中文网/ 问答频道 /正文

请看下面的代码,它显示了一个列表理解。。在

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

当您在python2.6中执行代码示例时,它将打印99,但在python3.x中执行时,它将打印6。在

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

提前谢谢你!在


Tags: 代码in示例列表forrange原因python3
3条回答

马克·拜尔斯完美地回答了这个问题。在

作为补充说明。
在Python2.x中,如果将方括号改为parens(创建生成器表达式而不是列表理解),您将注意到控制变量是而不是泄漏的。在

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

对比

^{pr2}$

(当然,在Python3中,这是固定的,并且列表理解不再是泄漏控制变量)

是的,这是有原因的,原因是他们不希望列表理解中的临时变量泄漏到外部命名空间中。因此,这是一个有意的改变,这是列表理解的结果,现在它是将生成器表达式传递给list()的语法糖。在

参考号:PEP3100。在

旧的行为是一个错误,但不容易修复,因为有些代码依赖它。在

列表理解中的变量i应该与顶层的变量i不同。从逻辑上讲,它应该有自己的范围,而不是延伸到理解之外,因为它的价值只在理解中有意义。但是在Python2.x中,由于实现细节的原因,范围超出了需要的范围,导致变量“泄漏”到外部范围,导致您看到的令人困惑的结果。在

python3.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

相关问题 更多 >