为什么下面的代码是真的?
>>> foo = {}
>>> foo > 1
True
>>> foo < 1
False
>>> foo == 0
False
>>> foo == -1
False
>>> foo == 1
False
我知道我想要的是len(foo)>1,但作为一个初学者,这让我很惊讶
来自文档:
运算符<gt;,==>=<=,和!=比较两个对象的值。对象不需要具有相同的类型。如果两者都是数字,则会将它们转换为通用类型。否则,不同类型的对象总是比较不相等,并且顺序一致但任意。您可以通过定义
__cmp__
方法或丰富的比较方法(如__gt__
)来控制非内置类型对象的比较行为,如第3.4节所述。(这种不寻常的比较定义用于简化排序和in和not in运算符等操作的定义。未来,不同类型对象的比较规则可能会发生变化。)
不兼容类型之间的丰富比较基于python2.x中类型的名称(?),在python3.x中被禁止。
无论如何,在python2.x中,对于特定的python实现和版本,排序可以保证给出相同的结果,但没有定义排序本身。
我认为这可能是因为比较运算符只需要部分定义即可派生,即如果您可以测试==和<则可以导出其余的运算符,<=是(<或==)、>不是<=,等等,所以在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
>>>