我不是在问 Python 的作用域规则。我大致 了解 Python for 循环中作用域的工作原理。我的问题是 为什么 以这种方式做出设计决策。例如(没有双关语):
for foo in xrange(10): bar = 2 print(foo, bar)
以上将打印(9,2)。
这让我觉得很奇怪:’foo’ 实际上只是控制循环,而’bar’ 是在循环内定义的。我可以理解为什么可能有必要在循环外部访问“bar”(否则,for 循环的功能将非常有限)。我不明白为什么在循环退出后控制变量必须保持在范围内。根据我的经验,它只会使全局命名空间变得混乱,并且更难追踪可能被其他语言的解释器捕获的错误。
最可能的答案是它只是保持语法简单,并没有成为采用的绊脚石,并且许多人很高兴在循环构造中分配名称时不必消除名称所属范围的歧义。变量不在范围内声明,它由赋值语句的位置暗示。关键字的global存在正是出于这个原因(表示分配是在全局范围内完成的)。
global
更新
这是关于该主题的一个很好的讨论:http: //mail.python.org/pipermail/python- ideas/2008-October/002109.html
先前关于将 for 循环变量设置为循环局部变量的提议偶然发现了现有代码依赖于循环变量在退出循环后保持其值的问题,这似乎被认为是一个可取的特性。
简而言之,您可能会将其归咎于 Python 社区:P