我正在编写一些代码,其中的情况与下面提供的代码类似。看来在第二个for循环中,num的值的变化正在被识别,而第一个for循环的值中却没有。为什么不呢?我该如何以它能识别的方式写这个呢?
num=3
for i in range(num):
for j in range(num):
print(i, j)
if num<5:
num=num+1
代码按照我预期的 (0, 0)、(0, 1) 等开始,但以 (2, 4) 结束,因为 j 已到达其范围的末尾。我不明白为什么第一个 for 循环不知道 num 已更新。
最佳答案
看来您希望 for 循环表现得像 while 循环。
让我们写一个稍微简单一点的例子来看看发生了什么。
num = 5
for j in range(num):
print(j)
if j == 3:
num = num + 1
输出
0
1
2
3
4
<--- No 5
您似乎期望上述行为与以下代码片段等效。
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 循环遍历可迭代对象中的项目(在这种情况下是一个范围
),可迭代不会在每次操作时重新评估。
范围
对象
让我们看另一个示例,它解释了为什么当 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 循环的可迭代没有重新计算,为什么内循环并不总是相同?
嗯,正是因为内循环在每次迭代时运行。在外循环的每次迭代中,都会为内循环创建一个新对象 range(num)
,并且由于 num
已更新,因此新创建的 范围
与初始范围不同。
关于python - 为什么 "j"能够识别范围变化,而 "i"却不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55926243/