2013-11-02 40 views
1

我注意到這個嘗試比較時:爲什麼{} | [] |()| str | set | etc。 > n在python2.x中等於True?

if len(sys.argv) >= 2: 
    pass 

,但我已經做到了這一點,仍然是真實的(我花了一些時間才找到錯誤。):

if sys.argv >= 2: # This is True!!! 
    pass 

下面是一些例子:

>>> {} > 2 
True 
>>> [] > 2 
True 
>>>() > 2 
True 
>>> set > 2 
True 
>>> str > 2 
True 
>>> enumerate > 2 
True 
>>> __builtins__ > 2 
True 
>>> class test: 
...  pass 
... 
>>> test 
<class __main__.test at 0xb751417c> 
>>> test > 2 
True 

在python3.x中它會導致TypeError。

回答

6

您在比較不同的類型。在Python 2中,類型通過名稱相對於彼此進行排序,數字類型爲總是在其他所有內容之前排序。

這是爲了允許對包含不同類型數據的異構列表進行排序而引入的。

的Python 3改正了這多少有些令人驚訝的行爲,有比較類型(以數字或彼此)總是除非自定義比較鉤明確允許的錯誤:

>>> {} > 3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: dict() > int() 
>>> class Foo: 
...  def __gt__(self, other): 
...   if isinstance(other, int): 
...    return True 
... 
>>> Foo() > 3 
True 
+0

非常感謝你,現在我明白了! –

相關問題