问题:Python“ for”循环的作用域
我不是在问Python的作用域规则。我大致了解作用域在Python中用于循环的原理。我的问题是为什么设计决策是以这种方式做出的。例如(无双关语):
for foo in xrange(10):
bar = 2
print(foo, bar)
上面将打印(9,2)。
这让我感到很奇怪:“ foo”实际上只是在控制循环,而“ bar”是在循环内部定义的。我可以理解为什么可能需要在循环外部访问“ bar”(否则,for循环的功能将非常有限)。我不明白的是为什么循环退出后,控制变量必须保留在范围内。以我的经验,它只会使全局命名空间混乱,并且使查找其他语言的解释器捕获的错误变得更加困难。
回答 0
最可能的答案是,它只是使语法简单,没有成为采用的绊脚石,而且许多人都对在循环结构中分配名称时不必消除名称的范围感到满意。变量不在范围内声明,而是由赋值语句的位置隐含。该global
关键字存在只是为了这个原因(象征分配在全球范围内完成)。
更新资料
这里是关于该主题的精彩讨论:http : //mail.python.org/pipermail/python-ideas/2008-October/002109.html
以前的使for循环变量位于循环本地的建议,偶然发现了现有代码的问题,该代码依赖循环变量在退出循环后保持其值,这似乎被认为是理想的功能。
简而言之,您可以将其归咎于Python社区:P
回答 1
Python不像其他一些语言(例如C / C ++或Java)一样没有块。因此,Python中的作用域单位是一个函数。
回答 2
一个非常有用的案例是使用时enumerate
,您希望最终总数:
for count, x in enumerate(someiterator, start=1):
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。
回答 3
如果您在循环中有一个break语句(并且想在以后使用迭代值,也许可以取回代码,为某些内容编制索引或提供状态),它可以节省一行代码和一次赋值,因此很方便。
回答 4
Python的主要影响力之一是ABC,这是一种在荷兰开发的语言,用于向初学者教授编程概念。Python的创建者Guido van Rossum在1980年代在ABC工作了几年。我对ABC几乎一无所知,但是由于它是面向初学者的,所以我认为它必须具有有限的作用域,就像早期的BASIC一样。
回答 5
对于初学者来说,如果变量是循环的局部变量,那么这些循环对于大多数现实世界的编程将毫无用处。
在当前情况下:
# Sum the values 0..9
total = 0
for foo in xrange(10):
total = total + foo
print total
Yield45
。现在,考虑分配在Python中的工作方式。如果循环变量严格是局部变量:
# 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
外部的变量不同。这不是最佳或预期的行为。