Python嵌套用于循环行为

时间:2013-08-07 16:10:35

标签: python for-loop nested-loops

我遇到了嵌套for循环这种奇怪的行为,我无法解释这个问题。这是一个特定于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

似乎外部for循环中的i和内部for循环中的i是不同的变量,尽管这对我来说似乎完全违反直觉。

任何输入(我对python相当新,但无法找到相关文档)

1 个答案:

答案 0 :(得分:9)

for循环在每次循环迭代时为i分配 new 值,即从循环迭代中获取的下一个值(在本例中为range(16))。

您可以在循环中修改i,但这不会改变正在使用的可迭代for

如果你想改变循环可迭代,那么你必须在迭代上直接这样做

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)

在这里,我们使用iterator objectrange(10)序列创建iter() function; 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循环语句是 nothing ,如C或Java或JavaScript for循环。这是一个Foreach looprange()只是生成一系列数字来循环,而不是C风格的for循环,它结合了初始赋值(i = 0),test(i < 16))并将循环增量(i += 1)放入一个语句中。