首页 > 解决方案 > 为什么总是显示最稀有的输出?(Python 3)

问题描述

每当我运行这个函数时,输出是

You found emerald!

为什么?找到祖母绿的几率只有 3/999,我通常应该找到别的东西。这不可能是纯粹的机会。我已经查看了代码,但找不到问题。

block=randint(1,1000)
    if block==456 or 742 or 327:
        print('You found emerald!')
    elif block==275 or 467 or 234 or 978 or 10 or 3 or 256 or 475 or 103 or 701 or 124 or 9:
        print('You found diamond!')
    elif block==range(900,930):
        print('You found iron!')
    elif block==range(800,870):
        print('You found coal!')
    else:
        print('You found stone...')

标签: pythonpython-3.x

解决方案


虽然您的情况在英语中可能有意义,但它实际上并没有像您期望它在 python 中那样做。让我们分解一下。

if block==456 or 742 or 327:

您在这里拥有的是一个具有真/假值的布尔语句,它由三个子语句组成:

if (block==456) or (742) or (327):

这是因为 python 语法的工作方式==是二元运算符(意​​味着它有两个操作数,一个在左侧,一个在右侧)or,同样,它也是一个二元运算符。所以python解释器不会将其解析为:

if block == (456 or 742 or 327):

仅仅是因为,好吧,这不是 python 设计的工作方式。

那为什么emerald每次都被选中呢?因为在这个声明中:

if (block==456) or (742) or (327):

您正在检查数字“742”的真/假值。根据 python 的规则(以及许多其他语言),值“0”将被评估为false,但任何其他数字将被视为true。所以你的测试解析为:

if (block==456) or (True) or (True):

这意味着它总是会返回 True,这就是为什么它总是会进入第一个条件分支,并返回最稀有的结果。

正如其他人在评论中提到的那样,您想要的不是相等检查,而是检查值是否包含在列表中:

if block in (456, 742, 327):

这将检查 的值block是否在指定的值列表内。


推荐阅读