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时如何停止此循环吗?
答案 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)
i
和j
都是在同一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不会进行无限循环,因为它对此有保护措施。