为啥这个while循环在Python中永远不会停止

Posted

技术标签:

【中文标题】为啥这个while循环在Python中永远不会停止【英文标题】:Why does this while loop never stops in Python为什么这个while循环在Python中永远不会停止 【发布时间】:2021-11-28 15:34:18 【问题描述】:

我正在尝试使用 Python 3.8 生成 100 个唯一随机数的列表。为此,我使用以下代码块:

import random

list_1_unique = [random.randint(0,30)]


for i in range(1, 100):
    x = random.randint(0, 30)
    while x in list_1_unique:
        x = random.randint(0, 30)
    list_1_unique.append(x)
    
list_1_unique

但是一旦我运行它,Ipython 控制台就永远不会停止,所以它进入了永恒循环,我不明白为什么?有人能猜到为什么吗?

【问题讨论】:

当 'x' 追加到列表时,列表大小发生变化 你生成一个随机数,然后将它添加到一个列表中,然后检查它是否在该列表中。这将一直持续到内存不足为止。 我删除了list_1_unique.append(x)前面的缩进,还是一样。 【参考方案1】:

您运行 for 循环的次数大于您可以从 randint 获得的可能不同值的数量,因此在 30 步左右后您的列表 list_1_unique em> 将具有所有可能的值,并且在 31° 步骤中,您将进入无限循环,因为您生成的任何 x 值都将在您的列表中,因此您无法退出 while 循环。

换句话说,你不能从一个只包含 30 个对象的盒子中挑选 100 个对象。

如果你想要一个包含 N 个随机数的样本,最好使用random.sample

>>> import random
>>> random.sample(range(1000),10)
[840, 872, 312, 952, 826, 867, 99, 4, 132, 745]
>>> 

【讨论】:

完美。谢谢【参考方案2】:

以下情况导致无限循环:

while x in list_1_unique

如果 x 在第一次点击 while 循环时恰好在列表中,那么你就走了。既然这样重复了 100 次,你猜怎么着,它一定会发生。

【讨论】:

如果 x 在 list_1_unique 我正在更新 x 的值,所以我认为你错了。 @G.T.不,您没有更改列表中 x 的值,而是添加了一个新值。要更改以前的值,您必须执行 list_name[index] = new_value @G.T.退出 while 循环后更新 x 并将其附加到列表中。列表不断获得越来越多的值,直到无法选择不在列表中的 x。

以上是关于为啥这个while循环在Python中永远不会停止的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个声音循环不会停止?

为啥 nodejs 中的睡眠不能按预期工作

带有条件的 Bash 单行 while 循环的语法

Python在While循环中继续缩进

为啥javascript不会在while循环中堆叠

Spring Batch 在流程中有两个步骤。为啥第二步永远不会运行,第一步是无限循环