首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python列表理解重写值

Python列表理解重写值
EN

Stack Overflow用户
提问于 2011-01-01 20:45:49
回答 4查看 2.4K关注 0票数 19

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

代码语言:javascript
复制
>>> i = 6
>>> s = [i * i for i in range(100)]
>>> print(i)

在Python2.6中执行代码示例时,它会打印99,而在Python3.x中执行它时会打印6

改变行为的原因是什么,以及为什么Python3.x中的输出6

提前谢谢你!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-01 20:48:08

这种旧的行为是错误的,但由于某些代码依赖于它,所以很难修复。

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

Python3.0故意不打算向后兼容以前的版本,因此他们利用这个机会修复了这种不可取的行为。

在Python2.3和更高版本中,列表理解“泄漏”每个包含的控制变量到包含的范围中。但是,这个行为是不推荐的,依赖它在Python3.0中是行不通的。

来源

票数 33
EN

Stack Overflow用户

发布于 2011-01-01 20:48:30

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

参考文献:PEP3100.

票数 7
EN

Stack Overflow用户

发布于 2011-01-01 21:29:42

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

作为一个副词..。

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

代码语言:javascript
复制
>>> i = 6
>>> s = (i for i in range(100))
>>> print i
6

代码语言:javascript
复制
>>> i = 6
>>> s = [i for i in range(100)]
>>> print i
99

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4575698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档