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时如何停止此循环?
好,首先,让我们修复缩进和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)
i
和j
都是在相同range(n)
上的迭代。当i
在最后一次迭代时(即i == n - 1
),则[[never可能没有i < j
,因为i
已经处于它们两个都可以拥有的最大值。这意味着无论a.append(0)
的值如何,我们都将[[always做w
,因此,无论我们经过while循环多少次,always都将以全零的数组结束。
i
迭代中,flag
保留为True
,并且while
永远不会终止。