为什么Python在循环后没有删除迭代变量?

zfz*_*zfz 4 python iterator loops ipython

我在运行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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 12

这不是一个bug.

for循环就不会创建一个新的范围.只有函数和模块引入了一个新的作用域,类,list/dict/set comprehensions *,lambdas和generator在作用域时都是专用函数.

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

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

此功能的实际用途是获取可迭代的最后一项:

last = defaultvalue
for last in my_iter:
    pass
Run Code Online (Sandbox Code Playgroud)

* Python 2中的列表推导类似于for循环,没有新的范围,但在Python 3中,它们以及跨Python版本的字典和集合理解确实创建了一个新的范围.

  • @jamylak:感谢您的参考,这是一个很好的用例简短说明. (3认同)