Python 嵌套 for 循环行为

标签 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 的新手,但找不到这方面的文档)

最佳答案

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)

在这里,我们创建一个 iterator object来自 range(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循环语句没有什么像 C 或 Java 或 JavaScript for环形。这是一个 Foreach loop反而。 range()简单地生成一个数字序列来循环,而不是 C 风格的 for循环,它将初始赋值 ( i = 0 )、测试 ( i < 16) ) 和循环增量器 ( i += 1 ) 组合到一个语句中。

关于Python 嵌套 for 循环行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108363/

相关文章:

Python,尝试解析html以获取电子邮件地址

c++ - 在一个程序中使用 for、while、do-while 循环

c++ - 难以理解此 for 循环中的增量

java - 嵌套循环中的随机不同数字

c - 删除 1 0's from an array, replaces 10' 和 0 的函数。将所有剩余元素移至数组开头

python - 尝试避免嵌套 for 循环

python - 在 Selenium 中使用 xpath 获取正确的节点?

python - 如何在列表框下打包水平滚动条(python 和 tkinter)?

python - 循环不适用于多处理和 sleep

java - 循环导致数组旋转超时