2009-11-22 57 views
2

我用蟒蛇上週寫的分配,這裏是一個代碼段爲什麼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呢?

回答

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節,標題爲「比較」,其中規定:

The operators <, >, ==, >=, <=, and != compare the values of two objects. The objects need not have the same type. If both are numbers, they are converted to a common type. Otherwise, objects of different types always compare unequal, and are ordered consistently but arbitrarily. You can control comparison behavior of objects of non-built-in types by defining a cmp method or rich comparison methods like gt, described in section Special method names.

(This unusual definition of comparison was used to simplify the definition of operations like sorting and the in and not in operators. In the future, the comparison rules for objects of different types are likely to change.)

這應該解釋都發生了什麼和它的理由。

順便說一句,我不知道在較新版本的Python中會發生什麼。

編輯:如果你想知道,Debilski的回答給出了Python 3

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'] 
+1

你不能比較和排序*一切*。嘗試排序複雜的數字,你會得到'TypeError:沒有爲複數定義的順序關係。 – 2009-11-22 19:31:53

1

我認爲Python允許這是因爲random.random對象可以通過包括__gt__方法來重寫>操作者在可能接受甚至期待一個數字的對象中。所以,python認爲你知道你在做什麼,並不報告它。

如果你嘗試檢查它,你可以看到,__gt__存在random.random ...

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

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

+0

我不認爲'__gt__'需要定義,以便Python允許在不同類型之間進行比較大的比較 – 2009-11-22 12:38:38

+0

這是真的,這不是必要的,但我想表明它存在random.random無論如何。 – 2009-11-22 12:52:32