【问题标题】: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)前面的缩进,还是一样。

标签: python-3.x list while-loop


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 2015-04-21
相关资源
最近更新 更多