我'm not asking about Python'的范围规则;我一般都了解Python for循环中的作用域是如何工作的 . 我的问题是为什么设计决策是以这种方式做出的 . 例如(没有双关语):
for foo in xrange(10):
bar = 2
print(foo, bar)
以上将打印(9,2) .
这让我感到很奇怪:'foo'实际上只是控制循环,而'bar'是在循环中定义的 . 我可以理解为什么'bar'可能需要在循环外部访问(否则,for循环将具有非常有限的功能) . 我不明白为什么在循环退出后控制变量必须保持在范围内 . 根据我的经验,它只会使全局命名空间变得混乱,并且更难以追踪其他语言中的解释器会捕获的错误 .
6 回答
最有可能的答案是,它只是保持语法简单,并不是采用的绊脚石,许多人都乐于在循环结构中分配名称时不必消除名称所属的范围 . 变量不在范围内声明,它由赋值语句的位置隐含 .
global
关键字仅因此而存在(表示分配在全局范围内完成) .Update
以下是关于该主题的很好的讨论:http://mail.python.org/pipermail/python-ideas/2008-October/002109.html
简而言之,您可能会将其归咎于Python社区:P
Python没有块,就像其他一些语言(如C / C或Java)一样 . 因此,Python中的作用域单元是一个函数 .
一个非常有用的情况是使用
enumerate
并且你想要最终的总计数:这有必要吗?不,但是,它确实很方便 .
另一件需要注意的事情是:在Python 2中,列表推导中的变量也被泄露:
但是,同样不适用于Python 3 .
Python的主要影响之一是ABC,这是荷兰开发的一种语言,用于向初学者教授编程概念 . Python的创建者Guido van Rossum在20世纪80年代在ABC工作了几年 . 我对ABC几乎一无所知,但是因为它适用于初学者,我认为它必须具有有限数量的范围,就像早期的BASIC一样 .
如果你在循环中有一个break语句(并希望稍后使用迭代值,也许是为了选择备份,索引或给出状态),它会为你节省一行代码和一个赋值,这样就方便了 .
对于初学者来说,如果变量是循环的局部变量,那么这些循环对于大多数真实世界的编程来说都是无用的 .
在目前的情况:
产量
45
. 现在,考虑一下赋值如何在Python中工作 . 如果循环变量是严格本地的:产生
0
,因为分配后循环内的total
与循环外的total
变量不同 . 这不是最佳或预期的行为 .