【问题标题】:How to stop python infinite loop?如何停止python无限循环?
【发布时间】:2020-05-09 15:29:42
【问题描述】:
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,但标志值仍然是是的。这个程序是为每一行生成至少一个随机整数,所以我正在检查零是否不等于没有列打破循环。有什么办法吗?

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

【问题讨论】:

  • 您知道break 声明吗?你也可以把整个事情变成一个函数并使用return
  • 上面的代码存在缩进问题!请修改它,然后我们可以从那里拿走它。
  • elif 后面的else 是什么意思?

标签: python infinite-loop


【解决方案1】:

好的,首先,让我们修复缩进和 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

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

那么,当我们在最后一个 i 上时,我们在 for 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)

ij 都是对同一 range(n) 的迭代。当i 处于最后一次迭代时(即i == n - 1),那么它永远不会拥有i &lt; j,因为i 已经处于它们中的任何一个可以拥有的最大值.这意味着无论w 的值如何,我们都会始终执行a.append(0),因此无论多少次,我们都会始终以全零数组结束我们通过那个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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多