【python】is和==

本文讨论了Python中`==`和`is`两种比较运算符的区别,指出`==`基于对象的值判断,而`is`则比较对象的身份。特别提到`NaN`和`Decimal`的特殊比较行为,以及如何影响`a==a`的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

结果符合预期?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allan_lam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值