有人可以向我解释一下两者之间的区别吗?这些通常是等价的吗?也许我在这里完全错了,但我认为每个比较运算符都必然与一个相关“丰富的对比”方法。这是来自文档:
运算符号与方法名的对应关系如下
如下:
x<y
calls x.__lt__(y)
, x<=y
calls x.__le__(y)
, x==y
calls x.__eq__(y)
, x!=y
calls x.__ne__(y)
, x>y
calls x.__gt__(y)
, and x>=y
calls x.__ge__(y)
.
这是一个证明我的困惑的例子。
Python 3.x:
dict1 = {1:1}
dict2 = {2:2}
>>> dict1 < dict2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'dict' and 'dict'
>>> dict1.__lt__(dict2)
NotImplemented
Python 2.x:
dict1 = {1:1}
dict2 = {2:2}
>>> dict1 < dict2
True
>>> dict1.__lt__(dict2)
NotImplemented
从 python 3 的例子来看,调用似乎是逻辑的dict1 < dict2
不支持。但是 Python 2 的例子呢?为什么会被接受?
我知道与Python 2不同,在Python 3中,并非所有对象都支持比较运算符。但令我惊讶的是,两个版本都返回NotImplemented
调用时单例__lt__()
.
这是依靠__cmp__
魔术方法,这是丰富比较运算符要取代的方法:
>>> dict1 = {1:1}
>>> dict2 = {2:2}
>>> dict1.__cmp__
<method-wrapper '__cmp__' of dict object at 0x10f075398>
>>> dict1.__cmp__(dict2)
-1
至于订购logic,这里是Python 2.7文档 https://docs.python.org/2/reference/expressions.html#value-comparisons:
映射(字典的实例)比较相等当且仅当它们具有
相等的(键,值)对。键和值的相等比较
强制自反性。
平等以外的结果得到一致解决,但并非如此
另有定义。
带脚注:
Python 的早期版本使用排序后的字典顺序比较
(键,值)列表,但这对于常见情况来说非常昂贵
比较是否相等。与更早版本的 Python 相比
仅按身份字典,但这引起了惊讶,因为
人们期望能够通过以下方式测试字典是否为空
将其与 {} 进行比较。
而且,在 Python 3.0 中,排序得到了简化。这是来自文档 https://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons:
排序比较运算符(<, <=, >=, >)
引发类型错误
当操作数没有有意义的自然顺序时例外。
builtin.sorted()
and list.sort()
不再接受 cmp 参数
提供比较功能。请改用 key 参数。
The cmp()
函数应该被视为消失了,并且__cmp__()
特殊方法
不再支持。使用__lt__()
用于排序,__eq__()
with
__hash__()
,以及根据需要进行其他丰富的比较。 (如果你确实需要cmp()
功能,您可以使用表达式(a > b) - (a <> b)
相当于cmp(a, b)
.)
因此,明确地说,在 Python 2 中,由于未实现丰富的比较运算符,dict
物体会回退到__cmp__
,来自数据模型文档 https://docs.python.org/2/reference/datamodel.html#object.__cmp__:
object.__cmp__(self, other)
如果丰富则通过比较操作调用
比较(见上文)未定义。应该返回负数
如果 self 他人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)