在外循环中删除增量不会更改输出,但是内循环会更改

时间:2019-07-19 04:34:16

标签: python loops

我的问题不是围绕输出,而是更多关于我们如何达到输出

原始-

n=5
i=0
j=1
line=''

for i in range(i,n+1):
    for j in range(j,i+1):
        line = line + str(j) + " "
        j += 1
    i +=1
    print( line)

我得到预期的输出-

1 
1 2 
1 2 3 
1 2 3 4 
1 2 3 4 5 

现在,如果我删除i +=1,我仍然会得到相同的输出。我不确定为什么吗? 为了进一步测试,我尝试删除j +=1,以查看

n=5
i=0
j=1
line=''

for i in range(i,n+1):
    for j in range(j,i+1):
        line = line + str(j) + " "
        #j += 1       ##Commenting the inner loop
    #i +=1            ##Commenting the outer loop
    print( line)

输出-

1 
1 1 2 
1 1 2 2 3 
1 1 2 2 3 3 4 
1 1 2 2 3 3 4 4 5

现在我很困惑,为什么除去外部循环不会更改任何内容,但是内部循环会更改输出?如果我删除了外循环,它为什么会递增?

3 个答案:

答案 0 :(得分:1)

在第一个版本中,您会遇到一些相互抵消的错误。这是不带手动增量的正确版本:

n, i, j = 5, 0, 1

for i in range(1,n+1):
    line = ""
    for j in range(1,i+1):
        line = line + str(j) + " "
    print(line)

真正的问题是:为什么手动增量版本有效?让我们尝试遵循以下逻辑:

首先,如果删除i += 1行,结果将保持不变,因为范围range(i,n+1)range(0,n+1)的计算一次。实际上,在评估范围时,i的值为0。该代码等效于:

for i in range(0,n+1):
    for j in range(j,i+1):
        line = line + str(j) + " "
        j += 1
    print( line)

让我们看一下for j in range(j,i+1)。由于j递增,因此其值始终与i相同,因此此范围仅包含一个元素:range(1,2)range(2,3),...代码等效于:

for i in range(1,n+1): # j starts at 1
    for j in range(i,i+1):
        line = line + str(j) + " "
    print( line)

等同于:

for i in range(1,n+1):
    j = i
    line = line + str(j) + " "
    print( line)

或者:

for i in range(1,n+1):
    line = line + str(i) + " "
    print( line)

要理解的是,您不必为每个i都建立一行,而是要建立1 2 3 4 5行并打印中间结果。

奖金:一线版:

print("\n".join(" ".join(str(j) for j in range(1, i+1)) for i in range(1, n+1)))

答案 1 :(得分:1)

在迭代循环时,手动增加计数器i和j不会更改计数器变量的状态。运行以下代码以了解:

for i in range(1,5):
    print(i)
    i +=2
    print(i)
    print('**') 

输出:

1
3
**
2
4
**
3
5
**
4
6
**

答案 2 :(得分:0)

内部循环与外部循环之间的区别在于,在外部循环的每次迭代中,都会创建新的内部循环,因此内部循环的起始点(j)取决于在循环外定义的变量“ j”与在循环外定义的“ i”不同,但是每次迭代时,“ for循环”都会保存循环的元数据(我想),并查看最后一次迭代。 / p>

,而在外循环中增量不起作用的原因- for循环仅依赖于for循环中定义的i和每个循环,他查看最后一次迭代的值,当内部循环每个外部迭代创建新的for循环并查看j的值时。

此外 如果您在已知的DS(Array,Dict ..)上使用for循环,则pythonic方法是对元素进行迭代,而不是使用索引的“ C”样式:)