为什么{} | [] |()| str | set | etc。 >在python2.x中n等于True?

时间:2013-11-02 15:41:45

标签: python python-2.7 comparison

我在尝试比较时注意到了这一点:

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。

1 个答案:

答案 0 :(得分:6)

您正在比较不同的类型。在Python 2中,类型通过 name 相对于彼此进行排序,并且数字类型总是在其他所有内容之前进行排序。

这是为了允许对包含不同类型数据的异构列表进行排序而引入的。

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