为什么Python允许比较可调用数和数字?

abl*_*lmf 2 python

我上周用python写了一个作业,这里是一个代码片段

def departTime():
    '''
    Calculate the time to depart a packet.
    '''
    if(random.random < 0.8):
        t = random.expovariate(1.0 / 2.5)
    else:
        t = random.expovariate(1.0 / 10.5)
    return t
Run Code Online (Sandbox Code Playgroud)

你能看到问题吗?我将random.random与0.8进行比较,后者应该是random.random().

当然这是因为我的粗心,但我不明白.在我看来,这种比较应该在任何编程语言中至少引用一个警告.

那么为什么python会忽略它并返回False?

Eda*_*aor 9

这并不总是一个错误

首先,为了使事情清楚,这并不总是一个错误.

在这种特殊情况下,很明显比较是一个错误.

但是,由于Python的动态特性,请考虑以下(完全有效,如果可怕)代码:

import random
random.random = 9 # Very weird but legal assignment.
random.random < 10 # True
random.random > 10 # False
Run Code Online (Sandbox Code Playgroud)

比较对象时实际发生了什么?

至于您的实际情况,将函数对象与数字进行比较,请查看Python文档:Python文档:表达式.查看标题为"比较"的第5.9节,其中说明:

运算符<,>,==,> =,<=和!=比较两个对象的值.对象不必具有相同的类型.如果两者都是数字,则将它们转换为通用类型.否则,不同类型的对象总是比较不相等,并且一致但是任意地排序.您可以通过定义一个控制非内建类型的对象进行比较的行为CMP方法或比较丰富的方法,如GT,在部分特殊方法名描述.

(这种不寻常的比较定义用于简化操作的定义,如排序和运算符中的in和not.将来,不同类型的对象的比较规则可能会发生变化.)

这应该解释发生了什么以及它的推理.

顺便说一下,我不确定在较新版本的Python中会发生什么.

编辑:如果您想知道,Debilski的答案提供了有关Python 3的信息.