代码之家  ›  专栏  ›  技术社区  ›  faceclean

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

  •  2
  • faceclean  · 技术社区  · 16 年前

    上周我用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
    

    你看到问题了吗?我比较了随机的。随机的和0.8,其中 应该是Random.Random()。

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

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

    4 回复  |  直到 16 年前
        1
  •  9
  •   Edan Maor    16 年前

    这并不总是一个错误

    首先,为了说明问题,这不是 总是 一个错误。

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

    但是,由于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节,标题为“比较”,其中说明:

    运算符<、>、==、>=、<=和!=比较两个对象的值。对象不需要具有相同的类型。如果两者都是数字,则它们将转换为通用类型。 否则,不同类型的对象总是比较不相等 ,并且顺序一致但任意。通过定义 化学机械抛光 方法或丰富的比较方法,如 燃气轮机 ,在特殊方法名称一节中描述。

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

    这应该解释发生了什么以及它的原因。

    顺便说一句,我不确定在更新版本的Python中会发生什么。

    编辑:如果你想知道,Debilski的答案提供了关于python 3的信息。

        2
  •  7
  •   Debilski    16 年前
        3
  •  3
  •   Daan Davidsz    16 年前

    因为在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']
    
        4
  •  1
  •   sharat87    16 年前

    我认为python允许这样做是因为random.random对象可以覆盖 > 操作员,包括 __gt__ 对象中的方法,该方法可能正在接受甚至需要一个数字。所以,巨蟒认为你知道你在做什么…并且不报告。

    如果你试着检查一下,你会发现 阿格特 随机存在。随机…

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

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