我不是在问Python的范围规则; 我一般都了解 Python for循环中的作用域是如何工作的.我的问题是为什么设计决策是以这种方式做出的.例如(没有双关语):
for foo in xrange(10):
bar = 2
print(foo, bar)
Run Code Online (Sandbox Code Playgroud)
以上将打印(9,2).
这让我感到很奇怪:'foo'实际上只是控制循环,而'bar'是在循环中定义的.我可以理解为什么'bar'可能需要在循环外部访问(否则,for循环将具有非常有限的功能).我不明白为什么在循环退出后控制变量必须保持在范围内.根据我的经验,它只会使全局命名空间变得混乱,并且更难以追踪其他语言中的解释器会捕获的错误.
Jer*_*own 98
最有可能的答案是,它只是保持语法简单,并不是采用的绊脚石,许多人都乐于在循环结构中分配名称时不必消除名称所属的范围.变量不在范围内声明,它由赋值语句的位置隐含.global关键字仅因此而存在(表示分配是在全局范围内完成的).
更新
以下是关于该主题的一个很好的讨论:http: //mail.python.org/pipermail/python-ideas/2008-October/002109.html
以前提出的循环变量局部循环的建议偶然发现现有代码的问题依赖于循环变量在退出循环后保持其值,并且似乎这被认为是一个理想的特征.
简而言之,您可能会将其归咎于Python社区:P
atz*_*tzz 58
Python没有块,其他语言(如C/C++或Java)也没有.因此,Python中的作用域单元是一个函数.
car*_*arl 38
一个非常有用的情况是在使用时enumerate,你想要最终的总数:
for count, x in enumerate(someiterator, start=1):
dosomething(count, x)
print "I did something {0} times".format(count)
Run Code Online (Sandbox Code Playgroud)
这有必要吗?不,但是,它确实很方便.
另一件需要注意的事情是:在Python 2中,列表推导中的变量也被泄露:
>>> [x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> x
9
Run Code Online (Sandbox Code Playgroud)
但是,同样不适用于Python 3.