如何停止python无限循环?

问题描述 投票:0回答:1
import random   
n=int(input())  
g = Graph(n)   
array=[]     
for i in range(0,n): 
    flag=True    
    while flag:
          print("flag=",flag)
          a=[]
          for j in range(0,n):
              if i!=j:
                 w= random.randint(0,1)
                 print("random=",w)
              if w==1 and i<j:
                 v=random.randint(1,10)
                 a.append(v)
              else:
                  a.append(0)
             elif i==j:
                  a.append(0)
          print(a)
          if a.count(0) !=n:
             print("a.count(0)=",a.count(0))
             flag=False
             print("flag value=",flag)
     array.append(a)
print(array) 

在此程序中,如果零的个数不等于n,它应该中断循环并将其附加到矩阵上,但是此循环运行了无数次,标志的值分配为false,但标志的值仍为true 。

所以请告诉我在零计数不等于输入n时如何停止此循环?

python infinite-loop
1个回答
0
投票

好,首先,让我们修复缩进和PEP8问题,并添加一些类型注释,以便我们了解发生了什么。 (添加类型注释有助于我找出缩进错误的位置,因为mypy指出了一些非显而易见的语法错误。)我只是删除了Graph内容,因为无论如何在此代码中都没有使用它不知道该进口来自何处。

import random
from typing import List

n = int(input())
array: List[List[int]] = []
for i in range(0, n):
    flag = True
    while flag:
        print("flag=", flag)
        a: List[int] = []
        for j in range(0, n):
            if i != j:
                w = random.randint(0, 1)
                print("random=", w)
                if w == 1 and i < j:
                    v = random.randint(1, 10)
                    a.append(v)
                else:
                    a.append(0)
            elif i == j:
                a.append(0)
        print(a)
        if a.count(0) != n:
            print("a.count(0)=", a.count(0))
            flag = False
            print("flag value=", flag)
    array.append(a)
print(array)

现在让我们看一下输出:

2
flag= True
random= 0
[0, 0]
flag= True
random= 1
[0, 6]
a.count(0)= 1
flag value= False
flag= True
random= 0
[0, 0]
flag= True
random= 1
[0, 0]
flag= True
random= 0
[0, 0]
flag= True
random= 0
[0, 0]
flag= True

因此,我们确实第一次通过循环(i = 0)打破了内部while循环,但是我们在外部for的每次迭代中都返回并重新启动它,第二次(i = 1),我们总是以a == [0] * n结尾。当我尝试使用n较高的值进行此操作时,似乎总是处于这种状态。

所以,我们在那个j循环中做什么,当我们在最后一次i迭代时,该循环总是导致一个全为零的数组?好吧,一切都归结到这个块:

                w = random.randint(0, 1)
                print("random=", w)
                if w == 1 and i < j:
                    v = random.randint(1, 10)
                    a.append(v)
                else:
                    a.append(0)

ij都是在相同range(n)上的迭代。当i在最后一次迭代时(即i == n - 1),则[[never可能​​没有i < j,因为i已经处于它们两个都可以拥有的最大值。这意味着无论a.append(0)的值如何,我们都将[[always做w,因此,无论我们经过while循环多少次,always都将以全零的数组结束。

这就是为什么在最后的i迭代中,flag保留为True,并且while永远不会终止。
© www.soinside.com 2019 - 2024. All rights reserved.