为什么空字典大于1?

时间:2013-06-24 20:17:51

标签: python

为什么以下代码为真?

>>> foo = {}
>>> foo > 1
True
>>> foo < 1
False
>>> foo == 0
False
>>> foo == -1
False
>>> foo == 1
False

我明白我想要的是len(foo)&gt; 1,但作为初学者,这让我感到惊讶。

3 个答案:

答案 0 :(得分:14)

来自docs

  

运算符&lt;,&gt;,==,&gt; =,&lt; =和!=比较两个对象的值。对象不必具有相同的类型。如果两者都是数字,则将它们转换为通用类型。否则,不同类型的对象总是比较不相等,并且一致但是任意地排序。您可以通过定义__cmp__方法或丰富的比较方法(如__gt__来控制非内置类型对象的比较行为,如3.4节所述。

     

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

答案 1 :(得分:7)

不兼容类型之间的丰富比较基于python2.x中类型的名称(?),并且在python3.x中已被禁止。

无论如何,在python2.x中,保证排序为特定的python实现和版本提供相同的结果,但是未定义排序本身。

答案 2 :(得分:3)

我认为这可能是因为比较运算符只需要部分定义为派生,即如果你可以测试==和&lt;那么你可以推导出其余的运算符,&lt; = is(&lt; or ==),&gt;不是&lt; =等等,所以在foo = {}的情况下你可以得到:

Python 2:

>>> foo == 0
False
>>> foo < 0
False
>>> not (foo <= 0)
True
so:
>>> foo > 0
True

python 3:

>>> foo = {}
>>> foo < 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: dict() < int()
>>> foo > 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: dict() > int()
>>> foo == 0
False
>>>