title中文 - 在Python中为'循环'确定范围




python画坐标图 (4)

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

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

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

以上将打印(9,2)。

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


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


最有可能的答案是它只是保持简单的语法,并不是收养的绊脚石,许多人都很高兴,因为在循环构造中赋予名称时,不必歧视名称所属的范围。 变量不在范围内声明,它由赋值语句的位置隐含。 global关键字只是出于这个原因才存在(表示分配是在全局范围内完成的)。

更新

以下是有关该主题的良好讨论: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html : http://mail.python.org/pipermail/python-ideas/2008-October/002109.html

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

简而言之,您可以将它归咎于Python社区:P


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

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

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

另一件需要注意的事情是:在Python 2中,列表解析中的变量也被泄漏:

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

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





scope