看看下面的代码,它显示了一个列表理解。
>>> i = 6
>>> s = [i * i for i in range(100)]
>>> print(i)在Python2.6中执行代码示例时,它会打印99,而在Python3.x中执行它时会打印6。
改变行为的原因是什么,以及为什么Python3.x中的输出6
提前谢谢你!
发布于 2011-01-01 20:48:08
这种旧的行为是错误的,但由于某些代码依赖于它,所以很难修复。
列表理解中的变量i应该是不同于顶层的i。从逻辑上讲,它应该有自己的范围,而不是延伸到理解之外,因为它的价值只有在理解中才有意义。但是在Python2.x中,由于实现细节,范围大于必需,导致变量“泄漏”到外部作用域中,导致您看到的结果令人困惑。
Python3.0故意不打算向后兼容以前的版本,因此他们利用这个机会修复了这种不可取的行为。
在Python2.3和更高版本中,列表理解“泄漏”每个包含的控制变量到包含的范围中。但是,这个行为是不推荐的,依赖它在Python3.0中是行不通的。
来源
发布于 2011-01-01 20:48:30
是的,这是有原因的,原因是他们不希望列表理解中的临时变量泄漏到外部命名空间中。因此,这是一种有意的更改,这是因为列表理解现在已成为将生成器表达式传递给list()的语法糖。
参考文献:PEP3100.
发布于 2011-01-01 21:29:42
马克·拜尔斯完美地回答了这个问题。
作为一个副词..。
在Python2.x中,如果将括号更改为parens (创建生成器表达式而不是列表理解),您将注意到控制变量没有泄漏。
>>> i = 6
>>> s = (i for i in range(100))
>>> print i
6与
>>> i = 6
>>> s = [i for i in range(100)]
>>> print i
99(当然,在Python 3中,这是固定的,列表理解不再是泄漏控制变量)
https://stackoverflow.com/questions/4575698
复制相似问题