我一直在尝试使用Python词典,并发现__gt__
和__lt__
是为字典实现的。
我已经对它们进行了测试,似乎它们以某种方式比较了这些键,但我不清楚它是如何完成的;例如,我不太确定{1: 1} > {'0': 0}
如何返回False
(事实上,'0' > 100000
也会返回True
。
是否有任何关于这两个功能实施细节的文件?
答案 0 :(得分:5)
文档有section on comparisons。特别是:
不同类型的对象,除了不同的数字类型和不同的字符串类型,从不比较相等;这些对象是一致但任意排序的(因此排序异构数组会产生一致的结果)。
行为的原因如:
>>> '0' < 0
False
>>> 0 < '0'
True
CPython中的是选择的“一致但任意”的比较方法是按类型名称和'str' > 'int'
按字母顺序排序:
CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
此行为为altered for Python 3.x,您无法再比较异构类型(或字典):
>>> '0' > 0
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
'0' > 0
TypeError: unorderable types: str() > int()
>>> {'a': None} > {'b': None}
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
{'a': None} > {'b': None}
TypeError: unorderable types: dict() > dict()
就字典而言,它们的排序方式如下:
d1 > d2
变为:
(len(d1) > len(d2) or
(len(d1) == len(d2) and
sorted(d1.items()) > sorted(d2.items()))
(您可以在CPython source code)中看到这一点。因此,如果长度不同,则“较长”的长度为“较大”:
>>> {1: 2, 3: 4} > {1: 2}
True
如果它们具有匹配的键,则具有“较大”值的键将“更大”:
>>> {1: 2} > {1: 1}
True
如果它们具有不匹配的键,则具有“较大”键的键会“较大”:
>>> {1: 2} > {2: 1}
False