如何停止python无限循环?

时间:2020-05-09 15:29:42

标签: python infinite-loop

import random   
n=int(input())  

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,但标志值仍为是的。此程序将为每一行生成至少一个随机整数,因此我正在检查零是否不等于列数是否会中断循环。是否有任何方法可以做到这一点?

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

2 个答案:

答案 0 :(得分:0)

好吧,首先,让我们修复缩进和PEP8问题,并添加一些类型注释,以便我们了解发生了什么。 (添加类型注释可帮助我修复缩进,因为尝试自动修复缩进会导致语法错误,因此我必须返回并更正。)我只是删除了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

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

那么,在最后一个for 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),则{strong>永远不会拥有i < j,因为i已经在它们中的任何一个都可以具有的最大值。这意味着无论a.append(0)的值如何,我们都会始终执行w,因此,始终最终将得到一个全零的数组。无论我们经过几次while循环。

在最后的i迭代中,flag仍为True,因为a.count(0) == n总是正确的,因此while flag在最后一次循环for i循环周围的循环永远不会终止。

一种向自己证明这一点的方法是简单地添加一个assert,如下所示:

                if w == 1 and i < j:
                    # This block is the only thing that can ever set flag to False!
                    assert i < n - 1, "We never get here on the last loop!"
                    v = random.randint(1, 10)
                    a.append(v)

并观察到这绝不会导致AssertionError

答案 1 :(得分:0)

Python不会进行无限循环,因为它对此有保护措施。