4

我在嵌套 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 还很陌生,但找不到关于此的文档)

4

1 回答 1

9

循环为每个循环迭代for分配一个i,即从循环迭代中获取的下一个值(在这种情况下为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)

在这里,我们使用函数从序列中创建一个迭代器对象;该语句在后台执行完全相同的操作,但现在我们可以直接处理迭代器。该函数将迭代器推进到下一个值,就像循环一样。range(10)iter()fornext()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循环完全不同。它是一个Foreach 循环。简单地生成一个数字序列来循环,与 C 风格的循环相反,它将初始赋值 ( )、测试 ( ) 和循环增量器 ( ) 组合到一个语句中。forrange()fori = 0i < 16)i += 1

于 2013-08-07T16:11:46.900 回答