5

我在运行ipython时发现了这种情况。python的版本是2.6.6和ipython 0.13。例如:

In [1]: for i in range(100):
   ...:     pass
   ...: 

In [2]: who
Out [2]: i  

In [3]: print i
Out [3]: 99

循环之后,变量i仍然存在。所以我想知道这是Python设计的错误吗?如果不是,为什么?谢谢。

4

1 回答 1

13

这不是一个错误。

for循环不会创建新范围。只有函数和模块引入了新的作用域,类、list/dict/set comprehensions *、lambdas 和 generators 在作用域方面是专门的函数。

这记录在for循环语句文档中:

循环结束时不会删除目标列表,但如果序列为空,则循环根本不会分配给它。

此功能的实际用途是获取 iterable 的最后一项

last = defaultvalue
for last in my_iter:
    pass

* Python 2 中的列表推导式像for循环一样工作,没有新的作用域,但在 Python 3 中,它们以及跨 Python 版本的 dict 和集合推导式确实创建了一个新作用域。

于 2013-05-25T08:39:31.867 回答