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

时间:2009-11-22 12:07:06

标签: 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

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

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

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

4 个答案:

答案 0 :(得分:9)

这并非总是错误

首先,只是为了弄清楚,这不是总是错误。

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

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

import random
random.random = 9 # Very weird but legal assignment.
random.random < 10 # True
random.random > 10 # False

比较对象时会发生什么?

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

  

运算符&lt;,&gt;,==,&gt; =,&lt; =和!=比较两个对象的值。对象不必具有相同的类型。如果两者都是数字,则将它们转换为通用类型。 否则,不同类型的对象总是比较不等,并且一致但是任意地排序。您可以通过定义 cmp 方法或丰富的比较方法(如 gt )来控制非内置类型对象的比较行为,如特殊方法名称一节中所述。

     

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

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

BTW,我不确定在较新版本的Python中会发生什么。

编辑:如果你想知道,Debilski的回答提供了有关Python 3的信息。

答案 1 :(得分:7)

答案 2 :(得分:3)

因为在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']

答案 3 :(得分:1)

我认为python允许这样做,因为random.random对象可以通过在对象中包含>方法来覆盖__gt__运算符,该方法可能接受甚至期望一个数字。所以,python认为你知道你在做什么......并且没有报告它。

如果您尝试检查它,可以看到random.random存在__gt__ ...

>>> random.random.__gt__
<method-wrapper '__gt__' of builtin_function_or_method object at 0xb765c06c>

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