【发布时间】:2018-05-27 14:21:12
【问题描述】:
谁能解释一下两者之间的区别。那些通常是等效的吗?也许我在这里完全错了,但我认为每个比较运算符都必然与一个“丰富的比较”方法相关。这是来自文档:
操作符和方法名的对应关系为 如下:
x<y调用x.__lt__(y),x<=y调用x.__le__(y),x==y调用x.__eq__(y),x!=y调用x.__ne__(y),x>y调用x.__gt__(y),和@98 @。
这是一个说明我的困惑的例子。
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 中,并非所有对象都支持比较运算符。但令我惊讶的是,两个版本在调用 __lt__() 时都会返回 NotImplemented 单例。
【问题讨论】:
-
转念一想,我误读了。将重新开放。
-
@cᴏʟᴅsᴘᴇᴇᴅ 嗯,这个问题与我的问题有很大不同。它没有解释两者之间的区别,也没有提供关于何时返回
NotImplemented的任何见解...... -
我还觉得有趣的是
<和__lt__不返回相同的结果。他们应该是因为<调用__lt__,对吧? -
@Ev.Kounis 是的,这是我的困惑。我总是理所当然地认为两者几乎基本相同。你能确认它确实没有返回同样的东西吗?也许是代码问题?
-
@scharette 我可以。用 Python 3.6.1 尝试过。我们需要等待这方面的大炮。
标签: python python-3.x python-2.7 comparison-operators