用python作为循环的范围

我不是在问Python的范围规则, 我通常理解Python的循环范围是如何工作的。 我的问题是为什么devise决定是这样做的。 例如(没有双关语意):

for foo in xrange(10): bar = 2 print(foo, bar) 

以上将打印(9,2)。

这让我感到奇怪:'foo'实际上只是控制循环,'bar'是在循环内部定义的。 我可以理解为什么可能有必要在循环之外访问“bar”(否则,for循环将具有非常有限的function)。 我不明白的是,为什么在循环结束之后,控制variables需要保持在范围之内。 根据我的经验,它只是混淆了全局名称空间,并且使得更难追查可能被其他语言的解释器捕获的错误。

最有可能的答案是,它只是保持简单的语法,并不是收养的绊脚石,而且很多人都很高兴不用歧义地指定名称在循环结构中赋予的范围。 variables不在范围内声明,它由赋值语句的位置隐含。 global关键字只是为了这个原因而存在(表示赋值是在全局范围内完成的)。

更新

下面是关于这个主题的一个很好的讨论: http : //mail.python.org/pipermail/python-ideas/2008-October/002109.html

先前提出的使循环variables局部于循环的build议已经偶然发现了依赖循环variables在退出循环之后保持其值的循环的现有代码的问题,并且似乎认为这被认为是期望的特征。

简而言之,您可能会将其归咎于Python社区:P

Python没有块,就像其他一些语言(如C / C ++或Java)一样。 因此,Python中的范围单元是一个函数。

这是一个非常有用的例子,当使用enumerate ,你想在最后的总数:

 for count, x in enumerate(someiterator): dosomething(count, x) print "I did something {0} times".format(count) 

这是必要的吗? 不,但确实很方便。

另一件需要注意的事情是:在Python 2中,列表parsing中的variables也被泄漏:

 >>> [x**2 for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> x 9 

但是,这同样不适用于Python 3。

对于初学者来说,如果variables是局部循环的,那么这些循环对于大多数现实世界的编程都是没有用的。

在目前情况下:

 # Sum the values 0..9 total = 0 for foo in xrange(10): total = total + foo print total 

收益45 。 现在,考虑Python中的赋值是如何工作的。 如果循环variables是严格局部的:

 # Sum the values 0..9? total = 0 for foo in xrange(10): # Create a new integer object with value "total + foo" and bind it to a new # loop-local variable named "total". total = total + foo print total 

得出0 ,因为赋值后的循环内的total与循环外部的total不是相同的variables。 这不会是最佳的或预期的行为。

对于Python的主要影响之一是ABC,这是一种在荷兰开发的用于为初学者教授编程概念的语言。 Python的创build者Guido van Rossum在20世纪80年代在ABC工作了几年。 我对ABC几乎一无所知,但是因为它是针对初学者的,所以我想它的范围应该是有限的,就像早期的BASIC一样。