2013-08-07 49 views
4

我遇到了这个奇怪的行为嵌套for循环,我不能为我的解释这一点。这是一个python特定的东西还是我只是监督一些东西?Python嵌套循环行为

这是我运行代码:

for i in range(16): 
    if i == 0: 
     for j in range(8): 
      print 'i is (if) ' + str(i) 
      i = i + 1 
    else: 
     print 'i is (else)' + str(i) 

这是我得到的输出:

i is (if) 0 
i is (if) 1 
i is (if) 2 
i is (if) 3 
i is (if) 4 
i is (if) 5 
i is (if) 6 
i is (if) 7 
i is (else)1 
i is (else)2 
i is (else)3 
i is (else)4 
i is (else)5 
i is (else)6 
i is (else)7 
i is (else)8 
i is (else)9 
i is (else)10 
i is (else)11 
i is (else)12 
i is (else)13 
i is (else)14 
i is (else)15 

这是我期待的输出:

i is (if) 0 
i is (if) 1 
i is (if) 2 
i is (if) 3 
i is (if) 4 
i is (if) 5 
i is (if) 6 
i is (if) 7 
i is (else)8 
i is (else)9 
i is (else)10 
i is (else)11 
i is (else)12 
i is (else)13 
i is (else)14 
i is (else)15 

看起来好像我在外循环和我在内循环是不同的变量,虽然这似乎完全counterintu对我来说很有意思。

任何输入(我是相当新的蟒蛇,但无法找到该文档)

+1

+1关于理解python变量范围的巧妙问题 –

回答

7

for循环分配i每次循环,即从回路获取下一个值迭代(在这种情况下range(16)

您可以修改i在循环本身,但是,这并不改变迭代for正在与。

如果你想改变厕所p迭代,那么你就必须这样做直接的迭代:

loop_iterable = iter(range(16)) 
for i in loop_iterable: 
    if i == 0: 
     for j in range(8): 
      print 'i is (if) ' + str(i) 
      i = next(loop_iterable) 
    else: 
     print 'i is (else)' + str(i) 

在这里,我们通过使用iter() function创建从range(10)序列iterator object; for语句在底层做了完全相同的事情,但是现在我们可以直接处理迭代器。 next() function将迭代器推进到下一个值,就像for循环所做的那样。

但是,它可能更容易只使用一个while循环,而不是:

i = 0 
while i < 16: 
    if i == 0: 
     for j in range(8): 
      print 'i is (if) ' + str(i) 
      i = next(loop_iterable) 
    else: 
     print 'i is (else)' + str(i) 
    i += 1 

要记住的一点是,Python的for循环语句是什么像C或Java或JavaScript for循环。相反,这是一个Foreach looprange()只是生成循环的数字序列,而不是C样式的for循环,它将初始分配(i = 0),测试(i < 16))和循环增量器(i += 1)组合成一个语句。

+0

*叹* - 一如既往,简洁明了。 :) –

+0

作为一个更详细的解释,从我的理解,发生的事情是范围函数返回一个可迭代的,即可以变成一个列表的东西,所以你在循环中做的是越过列表中的每个值。因此,您可以对该变量进行任何操作,因为当您再次迭代循环时,它只会从范围函数提供的“列表”中的下一个“索引”中获取值。 – Amndeep7

+0

@ Amndeep7:在Python 2中,'range()'在Python 3中返回一个列表,或者在使用'xrange()'时返回一个专用的范围对象。列表和范围对象都是可迭代的(它们是序列),但它们不是*迭代器*。 –