15

为什么下面的代码是真的?

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

我知道我想要的是 len(foo) > 1,但作为初学者,这让我感到惊讶。

4

3 回答 3

14

文档

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

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

于 2013-06-24T20:21:56.400 回答
7

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

无论如何,在 python2.x 中,对于特定的 python 实现和版本,排序保证给出相同的结果,但排序本身没有定义。

于 2013-06-24T20:20:31.937 回答
3

我认为这可能是因为比较运算符只需要部分定义即可导出,即如果您可以测试 == 和 < 那么您可以导出其余的运算符, <= 是 (< 或 == ), > 不是 <= 等,所以在 foo = {} 的情况下,您可以获得:

蟒蛇2:

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

蟒蛇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
>>> 
于 2013-06-24T20:38:39.207 回答