【发布时间】:2020-09-22 17:55:06
【问题描述】:
我正在尝试检测潜在的错误或重构两个对象之间比较操作的建议。
据我所知,我知道有两种类型的简单对象布尔相等比较:== 和 is。
== 表示两个对象的值是否相同。例如:
A=5
B=6
C=A
A==B --> returns False
A==C -> returns True
L1=[1,2,3]
L2=L1
L1==L2 --> returns True
L2=L1[:]
L1==L2 --> returns True
is 表示两个对象是否指向内存中的相同位置。将== 与is 交换的相同示例产生:
A=5
B=6
C=A
A is B --> returns False
A is C -> returns True
L1=[1,2,3]
L2=L1
L1 is L2 --> returns True
L2=L1[:]
L1 is L2 --> returns **False**
最后一个比较返回 False,因为尽管 L1 和 L2 具有相同的值,但 L2 仅存储在 L1 中的数据的副本,这意味着 L1 和 L2 指向不同的list 对象。
我的问题是: 对于这 2 种比较类型,您能想到一个示例,比较 不同 类型的对象对您的程序有用,即返回 `True. 你会说比较两种不同类型的代码很可能是一个错误吗?
我正在使用Python3。
【问题讨论】:
-
比较不同的类型离弱类型只有很短的路程,你只需要看看 JavaScript 的恶作剧就知道为什么这通常是个坏主意
-
好吧,在 JavaScript 中 '0'==0 是 True :)
-
另外... 1.0 == 1 几乎任何语言
-
确实存在两个对象比较相等的情况。最自然的例子可能是代表一个数字的两种不同类型。另一种自然情况是,当您有来自不同类的两个对象时,其中一个对象来自基类,另一个来自派生类,等等。您可能在一个类中也有一个
__eq__方法,该方法与任何其他类相同第二个对象,只要第二个对象具有与第一个对象相同的属性值,无论其类型如何。最后,这取决于您决定“平等”的含义。 -
@Orb 重载
is没有意义,it is not possible。运算符is比较对象的身份(如果它们是内存中的相同对象)。像这样想,两个双胞胎在某些方面(例如外表)可能相同,但他们不是同一个人。
标签: python comparison-operators