您似乎希望您的 for 循环表现得像一个 while 循环。
让我们写一个稍微简单的例子来看看发生了什么。
num = 5
for j in range(num):
print(j)
if j == 3:
num = num + 1
输出
0
1
2
3
4
<--- No 5
您似乎期望上面的行为等同于以下代码的 sn-p。
num = 5
j = 0
while j < num:
print(j)
if j == 3:
num += 1
j += 1
输出
0
1
2
3
4
5 <-- updating num added a value in the output
for 循环与 while 循环
for 循环和 while 循环之间的根本区别在于,只要条件为真,while 循环就会运行,并且它重新评估每次迭代的条件。同时,for 循环遍历可迭代对象(在这种情况下为 range)中的项目,可迭代对象不会在每次操作时重新计算。
range对象
让我们看看另一个例子,它解释了为什么当num 递增时,可迭代的range(num) 没有更新。
num = 5
r = range(num)
print(r) # range(0, 5)
num += 1
print(r) # still range(0, 5)
当调用range(num) 时,会创建一个可迭代对象。它接收值5 作为上限,根本不关心名称num。如您所见,当num 更新时,对象r 不受影响。为什么会呢?它被赋予了值5,这就是它所关心的。
回到你的代码
如果for循环的iterable没有被重新计算,那为什么内部循环并不总是一样呢?
嗯,正是因为内循环在每次迭代中运行。在外循环的每次迭代中,都会为内循环创建一个新对象range(num),并且由于此时num 已更新,因此新创建的range 与初始对象不同。