Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的作用域';对于';循环_Python_Scope - Fatal编程技术网

Python中的作用域';对于';循环

Python中的作用域';对于';循环,python,scope,Python,Scope,我不是问Python的范围规则;我大致了解Python中循环的作用域是如何工作的。我的问题是为什么设计决策是以这种方式做出的。例如(没有双关语): 上面将打印(9,2) 这让我觉得很奇怪:“foo”实际上只是控制循环,“bar”是在循环中定义的。我可以理解为什么“bar”必须在循环外部访问(否则,for循环的功能将非常有限)。我不明白的是,为什么在循环退出后控制变量必须保持在作用域内。根据我的经验,它只会使全局名称空间变得杂乱无章,并使跟踪其他语言的口译员可能捕获的错误变得更加困难。A因为这是在

我不是问Python的范围规则;我大致了解Python中循环的作用域是如何工作的。我的问题是为什么设计决策是以这种方式做出的。例如(没有双关语):

上面将打印(9,2)

这让我觉得很奇怪:“foo”实际上只是控制循环,“bar”是在循环中定义的。我可以理解为什么“bar”必须在循环外部访问(否则,for循环的功能将非常有限)。我不明白的是,为什么在循环退出后控制变量必须保持在作用域内。根据我的经验,它只会使全局名称空间变得杂乱无章,并使跟踪其他语言的口译员可能捕获的错误变得更加困难。

A因为这是在使用
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。

A因为这是在使用
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。

Python没有块,其他一些语言(如C/C++或Java)也没有块。因此,Python中的作用域单元是一个函数。

Python没有块,其他一些语言(如C/C++或Java)也没有块。因此,Python中的作用域单元是一个函数。

最可能的答案是,它只是保持了语法的简单性,没有成为采用的绊脚石,而且许多人都很高兴在循环构造中为名称分配时不必消除名称所属范围的歧义。变量不在范围内声明,它由赋值语句的位置暗示。关键字的存在正是因为这个原因(表示赋值是在全局范围内完成的)

更新

下面是关于这个话题的一个很好的讨论:

以前提出的关于循环的建议 循环的局部变量具有 偶然发现存在的问题 依赖于循环变量的代码 退出后保留其值 循环,看起来这是 被认为是可取的特征


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

最有可能的答案是,它只是保持了语法的简单性,没有成为采用的绊脚石,而且许多人都很高兴在循环构造中为名称分配时不必消除名称所属范围的歧义。变量不在范围内声明,它由赋值语句的位置暗示。关键字的存在正是因为这个原因(表示赋值是在全局范围内完成的)

更新

下面是关于这个话题的一个很好的讨论:

以前提出的关于循环的建议 循环的局部变量具有 偶然发现存在的问题 依赖于循环变量的代码 退出后保留其值 循环,看起来这是 被认为是可取的特征


简而言之,您可能会将其归咎于Python社区:Python的主要影响之一是,在荷兰开发的一种语言,用于向初学者教授编程概念。Python的创建者Guido van Rossum在20世纪80年代为ABC工作了几年。我对ABC几乎一无所知,但由于它是为初学者设计的,我想它的作用域一定是有限的,就像早期的基础知识一样。

Python的主要影响之一是在荷兰开发的一种语言,用于向初学者教授编程概念。Python的创建者Guido van Rossum在20世纪80年代为ABC工作了几年。我对ABC几乎一无所知,但由于它是为初学者设计的,我想它的作用域一定是有限的,就像早期的基础知识一样。

对于初学者来说,如果变量是循环的局部变量,那么这些循环对于大多数实际编程都是无用的

在当前情况下:

# Sum the values 0..9
total = 0
for foo in xrange(10):
    total = total + foo
print total
产量
45
。现在,考虑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
变量不同。这不是最佳或预期的行为。

对于初学者来说,如果变量是循环的局部变量,那么这些循环对于大多数实际编程都是无用的

在当前情况下:

# Sum the values 0..9
total = 0
for foo in xrange(10):
    total = total + foo
print total
产量
45
。现在,考虑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
变量不同。这不是最佳或预期的行为。

如果您在循环中有一个break语句(并且希望稍后使用迭代值,可能是为了提取、索引某些内容或给出状态),它将为您节省一行代码和一个赋值,因此这很方便。

如果您在循环中有一个break语句(如果以后想使用迭代值,可能是为了提取、索引某些内容或给出状态),它可以为您节省一行代码和一个赋值,因此很方便。

这是Python中的一种设计选择,它通常使某些任务比具有典型块作用域行为的其他语言中的任务更容易

但通常情况下,您仍然会错过典型的块作用域,因为,比方说,您可能有大的临时数组,应该尽快释放它们。这可以通过临时函数/类技巧来完成,但仍然可以通过直接操纵解释器状态来实现更简洁的解决方案

from scoping import scoping
a = 2 

with scoping():
    assert(2 == a)
    a = 3
    b = 4
    scoping.keep('b')
    assert(3 == a) 

assert(2 == a) 
assert(4 == b)
这是一个des