python中有两个比较运算子来判断两个是否相同。一个是==,一个是is。
== 传回为每个类别设定的 __eq __ 方法的结果。基本上就是用来表示值是否相等,设定了这样的方法。
另一方面,is 取得物件的 id 并判断是否匹配。即判断对像是否相同。此行为无法变更。
python 中的每个物件都有一个“标识符”,即 id。您可以使用内建函数 id() 进行检查。
== 为 True 但 is 为 False 的示例
这种情况经常发生。
例如:
a = [1,2,3]
b = [1,2,3]
c = 100000
d = sum(1 for i in range(100000))
e = "hello"
f = "".join(["h","e","l","l","o"])
print(a == b,a is b)
print(c == d,c is d)
print(e == f,e is f)
上述代码中的所有打印输出都将为 True/False。 (使用CPython3.11.4验证)
即使 ==,如果对象不同,is 当然也会是 False。
注意,虽然上述结果是在CPython中获得的,但在其他python处理系统中可能会返回不同的结果。 (例如,在 PyPy 中,c is d 是 True。)
is 为 True 但 == 为 False的示例
首先,python文档中有这样的描述。
等价对比必须是自反的。 也就是说,相同的对象必须相等:
如果 x 是 y ,那么 x == y
很奇怪的是,即使它们是同一个对象,==也会返回False。
当然,可以通过编写如下所示的类来实现这一点
class hoge():
def __eq__(self,other):
return False
a = hoge()
print(a == a,a is a)
结果是False True。 实际上有一个类具有这样的行为吗?
import decimal
a = float('NaN')
b = decimal.Decimal('NaN')
print(a == a,a is a)
print(b == b,b is b)
当我运行上面的代码时,结果是 False True。
当我阅读Python文档时,我发现了以下说法:
非数字值float(‘NaN’)和decimal.Decimal(‘NaN’)比较特殊。 数字和非数字之间的任何序数比较都是错误的。
一个违反直觉的结果是非数字并不等于它们本身。 例如,如果 x = float(‘NaN’),则 3 < x、x < 3、x == x 均为false,而 x != x 为 true。 此行为符合 IEEE 754 标准。
因此,发生了 x == x 为 false 的异常事件。
Bonus
准备一个这样的清单。
a = [float('NaN')]
当然,a is a是True。 那么 a == a 会发生什么呢?
print(a == a) # True
结果符合预期?