Python 中的比较运算符与“丰富比较”方法

2024-02-23

有人可以向我解释一下两者之间的区别吗?这些通常是等价的吗?也许我在这里完全错了,但我认为每个比较运算符都必然与一个相关“丰富的对比”方法。这是来自文档:

运算符号与方法名的对应关系如下 如下:

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(使用前将#替换为@)

Python 中的比较运算符与“丰富比较”方法 的相关文章

随机推荐

  • 如何使用jquery、express和handlebars创建无刷新页面?

    我正在学习 Express JS 我的问题是 我想使用 NodeJS 创建两个页面 它使用把手作为模板引擎 但我希望第一页应该使用发送res render home 第二个页面应该由 jQuery 使用 ajax 调用来调用 以表达并从表达
  • “错误:<路径> 属性 d:预期数字,“MNaN、NaNLNaN、NaNL…”。“ D3 错误

    我正在从 Quandl 的 API 导入一些数据 以制作多年来布伦特油价的图表 我正在提供来自 Angular 发出的 HTTP 请求的数据 不知何故 所提供的数据没有被读取为数字 因为我收到以下错误 错误 属性 d 预期数字 MNaN N
  • 设计 Vuetify 选择器的样式

    选择器的 Vuetify 组件是
  • TMonthCalendar 和 Delphi 样式 (Delphi XE2)

    TMontCalendar 似乎是一个 Windows 包装器 因此它不会受到新的 VCL 样式的影响 您知道解决方案吗 The TMonthCalendar http docwiki embarcadero com Libraries e
  • 当 Angular 完成向 DOM 添加范围更新时,如何触发方法?

    我正在寻找一种在向 scope 变量 在本例中为 scope results 添加更改后执行代码的方法 我需要这样做是为了调用一些遗留代码 这些代码要求项目位于 DOM 中才能执行 我的真实代码是触发 AJAX 调用 并更新作用域变量以更新
  • 如何使用 Sunspot 设置具有多对多关系的构面搜索?

    我之前没有实现过搜索功能 感觉有点卡住 我有一个太阳黑子搜索功能 可以根据关键字查找结果 这非常有效 但我现在想实现多选方面功能 但我什至不知道如何设置基本的方面搜索 我有多对多的关系 在 Rails 中而不是在现实生活中 类人 has m
  • 静态方法中的 Lock()

    我有一个多线程应用程序 它使用静态方法写入设置 xml 文件 我想避免文件同时更新两次 导致访问 写入异常 我怎么做 这不起作用 namespace Program public class Settings private static
  • DatePicker 未显示泰国文化的正确年份(2021 年应为 2564)

    我正在开发一个支持各种语言 文化的应用程序 但是 DatePicker 控件对于泰国文化来说似乎有问题 我尝试使用 ThreadCulture 也尝试过 CultureInfo CurrentCulture 或 CultureInfo Cu
  • C++11/14/17 Lambda 引用捕获 [&] 不复制 [*this]

    参考这个线程 https www open std org jtc1 sc22 wg21 docs papers 2018 p0806r2 html https www open std org jtc1 sc22 wg21 docs pa
  • System.getenv() 没有列出所有环境变量

    我注意到 JVM 没有获取我的一些环境变量 In my bash profile我定义了以下内容 IO HOME some value export IO HOME 并通过在 shell 中执行以下操作 echo IO HOME 我得到了正
  • Excel VBA,如何回复特定电子邮件

    我每个星期三都会收到来自特定发件人的邮件 此电子邮件的主题有时会发生变化 主题 暴露声明 COB 20150217 的示例 1 主题 保证金通知 COB 2015 Feb 10 的示例 2 发件人附加的日期是我收到邮件的前一天 我有以下代码
  • 具有固定标题的表格上的水平滚动

    我已经使用CSS创建了一个固定标题 主要只是设置要固定的标题位置 但是我遇到的问题是如果用户的分辨率大小或窗口大小小于表格大小 我需要添加在水平滚动条中 以便他们可以看到所有内容 我尝试将溢出设置为自动并滚动 但只有当我向下滚动到页面底部时
  • 如何加粗和更改图表标题的字体大小

    我可以动态创建箱线图 我现在面临的问题是我不知道如何bold并改变字体大小 of the 图表标题 我在网上研究了一段时间 但不知道如何做到这一点 这是我的代码 Chart Chart1 new Chart Chart1 DataSourc
  • CONTROL-C 之后 Django 服务器仍在运行

    我启动 Django 服务器python manage py runserver然后使用 CONTROL C 退出 但我仍然可以访问以下网址ROOT URLCONF why 可能您让另一个进程在其他地方运行 以下是列出命令包含的所有进程的方
  • string.replaceAll() 性能是否会受到字符串不变性的影响?

    假设我对一个大字符串调用了replaceAll 它替换了 1 000 个匹配实例 这是否意味着由于字符串不可变性 在进程中创建并重新分配了 1 000 个字符串 有没有更快的替代方案 如果你深入挖掘String http www docja
  • Java 泛型谜题,扩展类并使用通配符

    一段时间以来 我一直在努力解决这个问题 并认为也许一些新人会看到这个问题 谢谢你的时间 import java util class Tbin
  • ASP.NET - 以编程方式使用 GridView

    我继续从这个帖子 https stackoverflow com questions 1301581 asp net programmatic edit 经过多次谷歌搜索后 我想出了这段代码来以编程方式编辑单元格 using System
  • Windows Phone 8.1 运行时文本大纲

    Is there a way to show text outline on a TextBlock I am showing some text on top of map control and would like to show t
  • MinMax 树 - 当 Min 可以两步获胜时

    因此 我一直在尝试使用最小最大树来在两人棋盘游戏中创建一个简单的计算机玩家 我了解该算法的基础知识 但有一种情况让我的火鸡大脑无法理解 当 MIN 可以通过两步获胜时会发生什么 例如 假设在 connect4 tic tac toe 类型的
  • Python 中的比较运算符与“丰富比较”方法

    有人可以向我解释一下两者之间的区别吗 这些通常是等价的吗 也许我在这里完全错了 但我认为每个比较运算符都必然与一个相关 丰富的对比 方法 这是来自文档 运算符号与方法名的对应关系如下 如下 x