python for循环中的范围:为什么索引会减少

时间:2015-01-01 06:39:37

标签: python for-loop scope

出于好奇,我想看看

会发生什么
x=4
y=3
for y in xrange(0,y):
    print "Y---",y
    print "X---",x
    for x in xrange(0,x):
        print "x",x

打印出来

Y--- 0
X--- 4 

x 0
x 1
x 2
x 3

Y--- 1
X--- 3 

x 0
x 1
x 2

Y--- 2
X--- 2 

x 0
x 1

y按预期进展,但x减少 - 导致这种情况发生的原因是什么?

4 个答案:

答案 0 :(得分:4)

你的内部循环重新定义x,因此每个外部循环使它使用x的最后一个新的较小值。这使得内循环每次都变短。

答案 1 :(得分:1)

您的变量x = 4引用了第二个for循环中的x变量,即for x in xrange(0,x):,它们都在模块级范围内。因此,在内循环x的每次迭代之后,用新值来确定。

例如:

>>> x = 4
>>> for x in xrange(0, 2):
...     print x
...
0
1
>>> x
1

答案 2 :(得分:1)

这是因为您使用x作为要迭代的范围的输入,以及循环的实际计数器。 x保留作为内循环的一部分给出的最后一个值,并且xrange的性质是x-1。

要查看正在进行的操作,请尝试:

x = 10
for x in xrange(5):
    print x
print x

最终输出为4,因为这是x作为for循环的一部分的最后一个值。

如果您不想要此行为,请使用另一个变量作为内部循环的计数器。即。

x=4
y=3
for y in xrange(0,y):
    print "Y---",y
    print "X---",x
    for z in xrange(0,x):
        print "x",z

答案 3 :(得分:0)

与其他语言不同,Python循环不会引入新范围。这意味着使用x作为循环变量并不像你期望的那样遮蔽全局x - 相反,它会被重新分配。您可以通过循环后执行print x来看到这一点 - 它不会恢复到其预循环值,但保留它在上一次迭代时的值。这也是它将在外循环的下一次迭代中保留的值。通过使用在循环之前不存在的循环变量,您可以更清楚地看到相同的事情:如果循环创建了新范围,则尝试打印该变量将是NameError,但它不是。