为什么“ j”不能识别范围的变化,而“ i”却不能识别?

时间:2019-04-30 17:45:35

标签: python for-loop range

我正在处理某些代码,这种情况与下面提供的代码类似。似乎在第二个for循环中,num的值的变化被识别,而在第一个for循环的值中则没有。为什么不呢,我将如何以一种可以识别它的方式编写它呢?

my-website.com/test

代码开始于我期望的(0,0),(0,1)等,但是随着j到达其范围的末端而结束于(2,4)。我不明白为什么第一个for循环不知道num已更新。

4 个答案:

答案 0 :(得分:2)

您似乎希望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循环vs while循环

for循环和while循环之间的根本区别在于,只要条件为true,while循环就会运行,并且它会在每次迭代时重新评估条件。同时,for循环遍历可迭代对象(在这种情况下为range)中的项目,每次操作都不会重新评估可迭代

range对象

让我们看另一个示例,该示例解释了为什么range(num)递增时可迭代的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到那时已被更新,因此新创建的range与初始对象不相同。

答案 1 :(得分:0)

“ range(num)”仅被评估一次,而不是在每次迭代中评估一次。因此相当于

for i in range(3):
    for j in range(num):
        # do something with i and j

答案 2 :(得分:0)

def main():
    num=3
    for i in range(num):
        # Exiting nested for-loop causes range(num) to be re-evaluated
        for j in range(num):
            print(i, j)
            if num < 5:
                num=num+1

    # Now that we have exited the first for-loop,
    # range(num) is re-evaluated and 0,1,2,3,4 is printed
    for i in range(num):
        print(i)

if __name__ == '__main__':
    main()

答案 3 :(得分:0)

num值在调用for循环时被锁定。 num的值仅在执行时不调用时才更新。