有人可以解释为什么range
中的random.randint(0, len(messages) - 1)
末尾有负1吗?该列表具有9个值:
import random
messages = ['It is certain',
'It is decidedly so',
'Yes definitely',
'Reply hazy try again',
'Ask again later',
'Concentrate and ask again',
'My reply is no',
'Outlook not so good',
'Very doubtful']
select_number = random.randint(0, len(messages) - 1)
list_select = messages[select_number]
print(list_select)
答案 0 :(得分:1)
random.randint()
的第二个值是包括。它将从 10 个随机整数({{1},0
,1
,2
,3
,{{ 1}},4
,5
,6
和7
),列表中只有9个索引。 8
是9
,但是没有len(messages)
索引,因为Python索引从9
开始。相反,唯一有效的索引从messages[9]
到0
。
因此,通过使用0
,该功能仅限于为8
列表选择有效的索引。
该代码应改用random.choice()
,它从列表中选择一个随机元素:
random.randint(0, len(messages) - 1)
在其他情况下,random.randrange()
也可能是一个选项,因为它不将端点包含在可能的值中,其工作方式类似于Python索引,切片和messages
:
list_select = random.choice(messages)
答案 1 :(得分:0)
这是因为random.randint
随机选择列表的索引,从0到8,然后选择一条消息。
现在,列表的索引从0
到len(messages)-1=8
。
根据文档:https://docs.python.org/3/library/random.html#random.randint
random.randint(a,b)。 返回一个随机整数N,使得a <= N <= b。 randrange(a,b + 1)的别名。
这意味着选择了0到8之间的整数,这是列表的有效索引。如果我们改为放置len(messages)
,则也将选择索引9,这对于列表中的列表是无效的索引Python,因为Python列表是0-indexed
答案 2 :(得分:0)
random.randint(a, b)
返回一个随机整数N,以使<= N <= b。
len(messages) - 1
有点棘手,因为列表的范围确实是9,但是您要记住,计数是从0开始而不是1。因此,在您的情况下,len(messages)
将返回9,但是第一个元素在messages[0]
这意味着在您的情况下,select_number = random.randint(0, len(messages) - 1)
将从0到len(messages) - 1
的数字为9-1。