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

为什么Python允许比较可调用和数字?,python,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 def d

上周我用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
def departTime():
'''
计算离开数据包的时间。
'''
如果(随机。随机<0.8):
t=随机指数变量(1.0/2.5)
其他:
t=随机指数变量(1.0/10.5)
返回t
你能看到问题吗?我将random.random与0.8进行比较 应该是random.random()

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


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

因为在Python中,这是一个非常有效的比较。Python不知道您是否真的想要进行这种比较,或者您是否只是犯了一个错误。您的工作是为Python提供正确的比较对象

由于Python的动态特性,您可以将几乎所有内容与几乎所有内容进行比较和排序(这是一个特性)。在本例中,您将函数与浮点进行了比较

例如:

list = ["b","a",0,1, random.random, random.random()]
print sorted(list)
这将产生以下输出:

[0, 0.89329568818188976, 1, <built-in method random of Random object at 0x8c6d66c>, 'a', 'b']
[0,0.893295688188976,1,'a','b']

我认为python允许这样做,因为random.random对象可以覆盖
操作符,方法是在对象中包含一个
\uugt\uugt
方法,该方法可能接受或甚至期望一个数字。所以,python认为您知道自己在做什么。。。而且没有报告

如果您尝试检查它,您可以看到存在random的
\uu gt\uuu
。random

>>> random.random.__gt__
<method-wrapper '__gt__' of builtin_function_or_method object at 0xb765c06c>
>>随机。随机__

但是,这可能不是你想做的事情。

这并不总是一个错误

首先,我想说清楚,这并不总是一个错误

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

然而,由于Python的动态性质,考虑下面的(完全有效的,如果是可怕的)代码:

随机导入
random.random=9#非常奇怪但合法的转让。
random.random<10#正确
random.random>10#False
比较对象时实际会发生什么情况?

对于实际情况,将函数对象与数字进行比较,请查看Python文档:。查看标题为“比较”的第5.9节,其中说明:


运算符,==,>=,在Python3中是“固定的”。

我不认为需要定义
\uu gt\uuuu
,以便Python允许在不同类型之间进行大于的比较。这是真的,没有必要,但我想表明它存在于random.random中。无论如何,您无法对所有内容进行比较和排序。尝试对复数进行排序,您将得到
类型错误:没有为复数定义排序关系
import random
random.random = 9 # Very weird but legal assignment.
random.random < 10 # True
random.random > 10 # False