我在嵌套 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/