当前位置: 首页 > 面试题库 >

什么时候==运算符不等于is运算符?(python)

沈高峻
2023-03-14
问题内容

我注意到我可以使用==运算符比较所有本机数据类型(整数,字符串,布尔值,浮点数等),还可以比较包含本机数据类型的列表,元组,集合和字典。在这些情况下,==操作员将检查两个对象是否相等。但是在某些其他情况下(试图比较我创建的类的实例),该==运算符只是检查两个变量是否引用同一对象(因此在这些情况下,该==运算符等效于该is运算符)

我的问题是:什么时候==操作员不只是比较身份?

编辑:我正在使用Python 3


问题答案:

在Python中,==运算符是根据magic方法__eq__实现的,该方法默认情况下是通过身份比较来实现的。但是,您可以重写此方法,以提供自己的对象相等性概念。请注意,如果您这样做,通常也将至少覆盖__ne__(实现!=操作符)和__hash__计算实例的哈希码。

我发现,即使在Python中,使我的__eq__实现符合Java语言中为该equals方法的实现所列出的规则也非常有帮助:

  • 这是自反的:对于任何非空参考值x,x.equals(x)应该返回true。
  • 它是对称的:对于x和y的任何非空引用值,当且仅当y.equals(x)返回true时,x.equals(y)才返回true。
  • 它是可传递的:对于x,y和z的任何非空引用值,如果x.equals(y)返回true,而y.equals(z)返回true,则x.equals(z)应该返回true。
  • 这是一致的:对于任何非空引用值x和y,只要未修改对象的equals比较中使用的信息,对x.equals(y)的多次调用将始终返回true或始终返回false。
  • 对于任何非null参考值x,x.equals(null)应该返回false。

最后一个可能应该替换nullNone,但是规则在Python中并不像Java中那么容易。



 类似资料:
  • 问题内容: 我来自ac风格语言,因此我很自然地使用不相等的语言,但是当我使用Python时,从我阅读的文档中我了解到为此目的使用了运算符。 最近,我看到了很多使用的代码,所以我的问题是,其中之一比其他的更受青睐,还是其中之一被弃用了。 另外,我想知道它们之间是否有任何区别。 问题答案: 蟒2只支持 两个 ,在Python 3的操作者已被删除。 两者之间没有区别,但是是首选形式。

  • 问题内容: 有人可以解释一下SQL中的以下行为吗? 问题答案: 是标准SQL-92;是等效的。两者都评估值,但不是-是占位符,表示不存在值。 这就是为什么您只能在此类情况下使用/作为谓词的原因。 此行为不特定于SQL Server。所有符合标准的SQL方言都以相同的方式工作。 注意 :要比较如果您的 值不为null ,请使用,而要与 不为null 值进行比较,请使用。我不能说我的值是否等于NULL

  • 问题内容: 有两个不等于运算符-和。 它们之间有什么区别?我听说这比其他字符串比较有效。任何人都可以对此声明做出定性评论。 问题答案: 它们是相同的(与第三种形式一样)。 不过请注意,从解析器的角度来看,它们仍然被认为是不同的,这是为将不匹配或定义的存储轮廓。 这不像在解析器对待和还在分析阶段,所以你不能超载,并为不同的运营商。

  • 问题内容: 我从jls找到了报价: 相等运算符可用于比较两个可转换(第5.1.8节)为数字类型的操作数,或两个boolean或Boolean类型的操作数,或 两个分别为引用类型或null类型的操作数 。所有其他情况都会导致编译时错误。 但是这段代码 每个操作数都是参考! 说这是不兼容的类型。 jls在哪里说这些类型应该兼容? 问题答案: 在15.21.3节(参考相等运算符==和!=)中: 如果无法

  • 问题内容: 我看了这个关于表达式(以下简称“逗号操作”的问题)和MDN文档有关,但我想不出一个场景的地方是有用的。 那么,逗号运算符什么时候有用? 问题答案: 以下内容可能不是很有用,因为您不是自己编写的,但是压缩程序可以使用逗号运算符来缩小代码。例如: 会成为: 现在可以使用该运算符,因为逗号运算符(在一定程度上)允许将两个语句写为一个语句。 这 是 有用的,因为它允许一些整齐压缩(39 -这里

  • 我找到了JLS引文: 表示它是不兼容的类型。 在jls中哪些地方说这些类型应该兼容?