我上周用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?
答案 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)
这在Python 3 http://docs.python.org/3.1/whatsnew/3.0.html#ordering-comparisons中已经“修复”。
答案 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>
但是,这可能不是你想要做的事情。